剑指offer之26-30题解
劍指offer之26-30題解
目錄
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;}} }28. 數組中出現次數超過一半的數字
(一)題目描述
數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度為9的數組{1,2,3,2,2,2,5,4,2}。由于數字2在數組中出現了5次,超過數組長度的一半,因此輸出2。如果不存在則輸出0
(二)思路
(三)代碼實現
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)
(二)思路
(三)代碼實現
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题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑指offer之21-25题解
- 下一篇: 剑指offer之31-35题解