日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

剑指offer之26-30题解

發布時間:2024/2/28 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 剑指offer之26-30题解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

劍指offer之26-30題解


目錄

  • 二叉搜索樹與雙向鏈表
  • 字符串的排列
  • 數組中出現次數超過一半的數字
  • 最小的K個數
  • 連續子數組的最大和

  • 26. 二叉搜索樹與雙向鏈表

    (一)題目描述

    輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。

    (二)思路

    (三)代碼實現

    public class Solution {private TreeNode pre = null;private TreeNode head = null;public TreeNode Convert(TreeNode pRootOfTree) {inOrder(pRootOfTree);return head;}private void inOrder(TreeNode node) {if (node == null) {return;}inOrder(node.left);node.left = pre;if (pre != null) {pre.right = node;}pre = node;if (head == null) {head = node;}inOrder(node.right);} }

    27. 字符串的排列

    (一)題目描述

    輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba。

    (二)思路

    有些地方沒看懂,等刷完再回來看。代碼先附上。

    (三)代碼實現

    import java.util.ArrayList; import java.util.Arrays; public class Solution {private ArrayList<String> ret = new ArrayList<>();public ArrayList<String> Permutation(String str) {if (str.length()==0){return ret;}char[] chars = str.toCharArray();Arrays.sort(chars);backtracking(chars,new boolean[chars.length],new StringBuilder());return ret;}private void backtracking(char[] chars, boolean[] hasUsed, StringBuilder s) {if (s.length()==chars.length){ret.add(s.toString());return;}for (int i = 0; i < chars.length; i++) {if (hasUsed[i])continue;if (i!=0&&chars[i]==chars[i-1]&&!hasUsed[i-1]) //保證不重復continue;hasUsed[i] = true;s.append(chars[i]);backtracking(chars,hasUsed,s);s.deleteCharAt(s.length()-1);hasUsed[i] = false;}} }
  • 無返回值全排序
  • public static void printAllPermutations2(String str) {char[] chs = str.toCharArray();process2(chs, 0);}public static void process2(char[] chs, int i) {if (i == chs.length) {System.out.println(String.valueOf(chs));}HashSet<Character> set = new HashSet<>();for (int j = i; j < chs.length; j++) {if (!set.contains(chs[j])) {set.add(chs[j]);swap(chs, i, j);process2(chs, i + 1);swap(chs, i, j);}}}public static void swap(char[] chs, int i, int j) {char tmp = chs[i];chs[i] = chs[j];chs[j] = tmp;}

    28. 數組中出現次數超過一半的數字

    (一)題目描述

    數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度為9的數組{1,2,3,2,2,2,5,4,2}。由于數字2在數組中出現了5次,超過數組長度的一半,因此輸出2。如果不存在則輸出0

    (二)思路

  • 多投票問題,可以利用 Boyer-Moore Majority Vote Algorithm 來解決這個問題,使得時間復雜度為O(n)
  • 使用cnt來統計一個元素出現的次數,當遍歷到的元素和統計元素相同時,cnt++,否則另cnt–。如果前面查找了i個元素,且cnt==0,說明前i個元素沒有majority,或者有majority,但是出現的次數少于i/2,因為如果多余i/2的話cnt就一定不會為0.此時剩下的n-1個元素中,majority的數目依然多余(n-i)/2,因此繼續查找就能找出majority。
  • 即用for循環遍歷chars,找出最多的一個數字,然后統計這個最多出現的數字的次數,如果大于str.length()/2,則返回。
  • (三)代碼實現

    public class Solution {public int MoreThanHalfNum_Solution(int[] array) {int majority = array[0];for (int i = 1, cnt = 1; i < array.length; i++) {cnt = array[i] == majority ? cnt + 1 : cnt - 1;if (cnt == 0) {majority = array[i];cnt = 1;}}int cnt = 0;for (int val : array) if (val == majority) cnt++;return cnt > array.length / 2 ? majority : 0;} }

    29. 最小的K個數

    (一)題目描述

    輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。

    (二)思路

  • 直接進行排序,list添加前4個即可。如果是海量數據,則使用堆排

  • 利用大小為K的最小堆(特別適合海量數據)。

  • 使用大頂堆來維護最小堆,而不能直接創建一個小頂堆并設置一個大小,企圖讓小頂堆中的元素都是最小元素。

  • 維護一個大小為K的最小堆過程如下:在添加一個元素之后,如果大頂堆的大小大于K,那么需要將大頂堆的堆頂元素去除。

  • (三)代碼實現

    import java.util.ArrayList; import java.util.PriorityQueue; public class Solution {public ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k) {if (k > input.length || k <= 0)return new ArrayList<>();PriorityQueue<Integer> maxHeap = new PriorityQueue<>((o1, o2) -> o2 - o1);for (int num : input) {maxHeap.add(num);if (maxHeap.size() > k)maxHeap.poll();}return new ArrayList<>(maxHeap);} }

    30. 連續子數組的最大和

    (一)題目描述

    HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會后,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,并期望旁邊的正數會彌補它呢?例如:{6,-3,-2,7,-15,1,2,2},連續子向量的最大和為8(從第0個開始,到第3個為止)。給一個數組,返回它的最大連續子序列的和,你會不會被他忽悠住?(子向量的長度至少是1)

    (二)思路

  • 創建一個變量greatestSum存放最大的和,創建遍歷sum存放和。
  • 遍歷數組,sum如果小于等于0那么直接將val賦給它,否則sum+val。(即只要大于0,就相加)
  • 將sum和greatestSum利用Math函數取得最大值保存
  • (三)代碼實現

    public class Solution {public int FindGreatestSumOfSubArray(int[] array) {if (array.length == 0 || array == null) return 0;int greatestSum = Integer.MIN_VALUE;int sum = 0;for (int val : array) {sum = sum <= 0 ? val : sum + val;greatestSum = Math.max(greatestSum, sum);}return greatestSum;} }

    總結

    以上是生活随笔為你收集整理的剑指offer之26-30题解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。