@@ -895,13 +895,14 @@ public static boolean VerifySquenceOfBST(int[] sequence, int start, int end) {
895
895
} else if (rightChildIndex== start) {// 说明全部位于右边子树
896
896
return VerifySquenceOfBST(sequence,start,end- 1 );
897
897
}
898
+ // 继续校验
898
899
return VerifySquenceOfBST(sequence,start,rightChildIndex- 1 ) && VerifySquenceOfBST(sequence,rightChildIndex, end- 1 );
899
900
}
900
901
```
901
902
902
903
## 题023 二叉树中和为某一值的路径
903
904
904
- 输入一颗二叉树的跟节点和一个整数 ,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的 list 中,数组长度大的数组靠前)
905
+ 输入一颗二叉树的根节点和一个整数 ,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的 list 中,数组长度大的数组靠前。 )
905
906
906
907
就是递归调用每个节点的左右子树,然后将节点值相加,如果节点值和为某个预期值,并且该节点为叶子节点,那么这条路径就是要找的路径。
907
908
@@ -1067,8 +1068,6 @@ public RandomListNode Clone(RandomListNode pHead)
1067
1068
}
1068
1069
```
1069
1070
1070
-
1071
-
1072
1071
## 题027数组中出现的次数超过一半的数字
1073
1072
1074
1073
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出 2 。如果不存在则输出 0 。
@@ -1115,7 +1114,7 @@ public int MoreThanHalfNum_Solution(int [] array) {
1115
1114
1116
1115
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
1117
1116
1118
- 其实就是插入排序,只不过只是对k个数进行插入排序
1117
+ 其实就是插入排序,只不过只是对k个数进行插入排序,但是这样的时间复杂度会是O(N^2),如果是使用快排来做,平均时间复杂度就是O(N)。
1119
1118
1120
1119
``` java
1121
1120
public ArrayList<Integer > GetLeastNumbers_Solution(int [] input, int k) {
@@ -1150,13 +1149,13 @@ public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
1150
1149
1151
1150
## 题029连续子数组的最大和
1152
1151
1153
- 例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止 )。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)
1152
+ 例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第1个开始,到第4个为止 )。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)
1154
1153
1155
1154
使用动态规划的方法来进行思考
1156
1155
1157
1156
f(n) 有两种取值
1158
1157
1159
- * 当f(n-1)<=0时,取array[ n]
1158
+ * 当f(n-1)<=0时,取array[ n] ,从这个元素重新开始
1160
1159
1161
1160
* 当f(n-1)>0时,取f(n-1)+array[ n]
1162
1161
@@ -1169,7 +1168,7 @@ f(n) 有两种取值
1169
1168
int currentSum = array[0 ];
1170
1169
int maxSum = currentSum;
1171
1170
for (int i = 1 ; i < array. length; i++ ) {
1172
- if (currentSum< 0 ) {
1171
+ if (currentSum< 0 ) {// 前面的和是负数,就直接丢弃
1173
1172
currentSum = array[i];
1174
1173
} else {
1175
1174
currentSum = currentSum + array[i];
@@ -1618,7 +1617,7 @@ public int IsBalanced_Solution_Depth(TreeNode root) {
1618
1617
int right = IsBalanced_Solution_Depth(root. right);
1619
1618
if (left!= - 1 && right!= - 1 ) {
1620
1619
int temp = left- right;
1621
- if (temp<= 1 && temp>= - 1 ) {
1620
+ if (temp<= 1 && temp>= - 1 ) {
1622
1621
return left > right ? left + 1 : right + 1 ;
1623
1622
}
1624
1623
}
@@ -1868,7 +1867,7 @@ public static void qsort(int[] array, int start ,int end) {
1868
1867
在n个人中间报数时,每个人的编号是
1869
1868
0 1 2 ... k k+1 k+2 ... n-1
1870
1869
当k出局以后,在n-1个人中报数时,每个人的编号是重新从k+1开始计数,原来的编号就映射为下面这样了(原来k+1变成了0,原来的n-1变成了n-1-(k+1))
1871
- n-k+ 1 ... 0 1 ... n-1 -(k+1)
1870
+ n-k- 1 ... 0 1 ... n-1 -(k+1)
1872
1871
所以假设从n-1报数时的编号到n个人报数时的编号存在一个映射关系
1873
1872
假设f(n)代表n个人报数编号
1874
1873
f(n) = (f(n-1)+k+1)%n = (f(n-1)+ (m-1)%n + 1)%n =
@@ -1956,7 +1955,7 @@ public int Add(int num1,int num2) {
1956
1955
1957
1956
-2147483648 至 2147483647
1958
1957
1959
- -2的31次方 2的31次方-1
1958
+ -2的31次方 2的31次方 -1
1960
1959
1961
1960
``` java
1962
1961
public static int StrToInt(String str) {
@@ -2037,12 +2036,14 @@ public int[] multiply(int[] A) {
2037
2036
int [] d = new int [A . length];
2038
2037
c[0 ] = 1 ;
2039
2038
int result1 = c[0 ];
2039
+ // 构建数组C
2040
2040
for (int i = 1 ; i < c. length; i++ ) {
2041
2041
result1 = result1 * A [i- 1 ];
2042
2042
c[i] = result1;
2043
2043
}
2044
2044
d[d. length- 1 ] = 1 ;
2045
2045
int result2 = 1 ;
2046
+ // 构建数组D
2046
2047
for (int i = d. length- 2 ; i >= 0 ; i-- ) {
2047
2048
result2 = result2 * A [i+ 1 ];
2048
2049
d[i] = result2;
@@ -2070,15 +2071,15 @@ public int[] multiply(int[] A) {
2070
2071
}
2071
2072
2072
2073
public char FirstAppearingOnce()
2073
- {
2074
- for (int i = 0 ; i < str. length(); i++ ) {
2075
- char c = str. charAt(i);
2076
- if (table[c] == 1 ) {
2077
- return c;
2078
- }
2079
- }
2080
- return ' #' ;
2074
+ {
2075
+ for (int i = 0 ; i < str. length(); i++ ) {
2076
+ char c = str. charAt(i);
2077
+ if (table[c] == 1 ) {
2078
+ return c;
2079
+ }
2081
2080
}
2081
+ return ' #' ;
2082
+ }
2082
2083
```
2083
2084
2084
2085
## 题054 链表中环的入口节点
@@ -2088,11 +2089,11 @@ public char FirstAppearingOnce()
2088
2089
2089
2090
一种方法是遍历整个链表,将每个节点添加到HashSet中,判断是否在HashSet中出现过,第一个重复的节点就是环的入口节点。
2090
2091
2091
- 另一种解决方法是,假设存在环,环的长度为x,第一个指针先走x步,然后第二个指针从链表头结点出发,两个指针一起走,当第而个指针刚好走到环入口时 ,第一个指针正好在环中走了一圈,也在环的入口,此时的节点就是环的的入口节点,
2092
+ 另一种解决方法是,假设存在环,环的长度为x,第一个指针先走x步,然后第二个指针从链表头结点出发,两个指针一起走,当第二个指针刚好走到环入口时 ,第一个指针正好在环中走了一圈,也在环的入口,此时的节点就是环的的入口节点,
2092
2093
2093
2094
怎么得到环的长度呢,就是一个指针每次走2步,一个指针每次走一步,他们相遇时的节点肯定就是在环中的某个节点,然后这个节点在环中遍历一圈,回到原点,就可以得到环的长度count。
2094
2095
2095
- 两个指针从头出发,第一个指针先走count步,然后两个指针每次都只走一步,相遇的地方就是环的入口,
2096
+ 两个指针从头出发,第一个指针先走count步,然后两个指针每次都只走一步,相遇的地方就是环的入口。
2096
2097
2097
2098
``` java
2098
2099
public ListNode EntryNodeOfLoop(ListNode pHead)
@@ -2193,7 +2194,6 @@ public ListNode deleteDuplication(ListNode pHead)
2193
2194
2194
2195
ListNode ourHead = new ListNode (0 );
2195
2196
ourHead. next = pHead;
2196
- int temp = pHead. val;
2197
2197
ListNode preNode = ourHead;
2198
2198
ListNode currentNode = ourHead. next;
2199
2199
@@ -2329,7 +2329,7 @@ public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
2329
2329
int flag = 0 ;// 代表当前遍历的是奇数层还是偶数层。区别在于添加子节点的顺序。
2330
2330
stack1. add(pRoot);
2331
2331
while ((flag == 0 && stack1. size()> 0 ) || (flag == 1 && stack2. size()> 0 )) {
2332
- if (flag== 0 ) {
2332
+ if (flag== 0 ) {// 代表是偶数层
2333
2333
ArrayList<Integer > array = new ArrayList<Integer > ();
2334
2334
while (stack1. size()> 0 ) {
2335
2335
TreeNode node = stack1. pop();
@@ -2439,7 +2439,7 @@ ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
2439
2439
2440
2440
就是递归遍历每一个节点,遍历时传入深度depth,将节点加入到ArrayList中特定深度对应的数组中去。
2441
2441
2442
- 这种方法也可以用来进行二叉树深度遍历 ,遍历完之后将嵌套数组拆分成单层的数组。
2442
+ 这种方法也可以用来进行二叉树先序遍历 ,遍历完之后将嵌套数组拆分成单层的数组。
2443
2443
2444
2444
``` java
2445
2445
ArrayList<ArrayList<Integer > > Print2(TreeNode pRoot) {
@@ -2738,7 +2738,7 @@ boolean judge(char[] matrix, int rows, int cols, int i, int j, char[] str, int c
2738
2738
return false ;
2739
2739
}
2740
2740
if (charIndex== str. length- 1 ) { return true ;}
2741
-
2741
+ // 用来记录这个位置是否在路径中
2742
2742
flag[index]= true ;
2743
2743
if (judge(matrix,rows,cols,i+ 1 , j, str, charIndex+ 1 , flag)
2744
2744
|| judge(matrix,rows,cols,i- 1 , j, str, charIndex+ 1 , flag)
@@ -2846,10 +2846,6 @@ public int cutRope(int target) {
2846
2846
}
2847
2847
```
2848
2848
2849
-
2850
-
2851
-
2852
-
2853
2849
# 基础篇
2854
2850
2855
2851
## 二分查找
0 commit comments