diff --git a/code/lc15.java b/code/lc15.java index 29a9fc25353837d3ed8302f4493530eb3fd5d402..781fc428f8342932e634c1b34a65d5eba5d11705 100644 --- a/code/lc15.java +++ b/code/lc15.java @@ -5,6 +5,7 @@ package code; * 难度:Medium * 分类:Array, Two Pointers * 注意:如何避免 List 重复元素 + * Tips:lc15, lc16, lc923 */ import java.util.*; diff --git a/code/lc16.java b/code/lc16.java index b18f4130094fc5eb5ff6997156a755a4d771063a..7747291deb8dcc311d61df1a37a939fffa1b12ea 100644 --- a/code/lc16.java +++ b/code/lc16.java @@ -7,7 +7,7 @@ import java.util.Arrays; * 难度:Medium * 分类:Array, Two Pointers * 思路:3sum的思路,每次记下最接近的res即可 - * Tips: + * Tips:lc15, lc16, lc923 */ public class lc16 { public int threeSumClosest(int[] nums, int target) { diff --git a/code/lc53.java b/code/lc53.java index e134b12b7718d9c4ee68deccd21f647330ee0dcd..b73be9908a69528428240c6fc51245ebb1b85446 100644 --- a/code/lc53.java +++ b/code/lc53.java @@ -5,6 +5,7 @@ package code; * 难度:Easy * 分类:Array, Divide and Conquer, Dynamic Programming * 注意:分治方法如何进行merge,merge时,必须包含mid元素,因为是连续子序列 + * lc978 */ public class lc53 { public static void main(String[] args) { diff --git a/code/lc560.java b/code/lc560.java index f5eb8449c5670373f5cb22d54faf8f0c9268dd53..e7f6d158f0fca63a6e43bef1658a9059804f14ec 100644 --- a/code/lc560.java +++ b/code/lc560.java @@ -4,7 +4,7 @@ import java.util.HashMap; /* * 560. Subarray Sum Equals K - * 题意:子数组的和等于k的个数 + * 题意:连续子数组的和等于k的个数 * 难度:Medium * 分类:Array, Hash Table * 思路:求出累加和存在hashmap中,如果当前hashmap中存在sum-k,那么就是一个解 diff --git a/code/lc921.java b/code/lc921.java new file mode 100644 index 0000000000000000000000000000000000000000..88d463a89db7dd3cf6ab497c6816822f0b635f29 --- /dev/null +++ b/code/lc921.java @@ -0,0 +1,25 @@ +package code; + +import java.util.Stack; +/* + * 921. Minimum Add to Make Parentheses Valid + * 题意:最少添加符号个数,使得表达式有效 + * 难度:Medium + * 分类:Stack, Greedy + * 思路:匹配的都出栈,最后剩下的栈中没匹配的个数,就是需要添加的个数 + * Tips: + */ +public class lc921 { + public int minAddToMakeValid(String S) { + char[] ch_arr = S.toCharArray(); + Stack st = new Stack<>(); + for (int i = 0; i < ch_arr.length ; i++) { + if(ch_arr[i]==')' && !st.isEmpty() && st.peek()=='('){ + st.pop(); + }else{ + st.push(ch_arr[i]); + } + } + return st.size(); + } +} diff --git a/code/lc922.java b/code/lc922.java new file mode 100644 index 0000000000000000000000000000000000000000..b3022ebfd09009368b9de069071466e09be8ad8e --- /dev/null +++ b/code/lc922.java @@ -0,0 +1,38 @@ +package code; +/* + * 922. Sort Array By Parity II + * 题意:奇数位置上都是奇数,偶数位置上都是偶数 + * 难度:Easy + * 分类:Array, Sort + * 思路:题看似简单,但最优的方法并不好写 + * Tips: + */ +public class lc922 { + public int[] sortArrayByParityII(int[] A) { //O(N^2) + for (int i = 0; i < A.length ; i++) { + if( A[i]%2==i%2 ) continue; + for (int j = i+1; j < A.length ; j++) { + if(A[i]%2!=A[j]%2) { + int temp = A[i]; + A[i] = A[j]; + A[j] = temp; + break; + } + } + } + return A; + } + + public int[] sortArrayByParityII2(int[] A) { //很巧妙的方法 O(N)时间, O(1)空间 + int cur = 1; //奇数位置的位置 + for (int i = 0; i < A.length ; i+=2) { //这里+2 只判断偶数位置上是否符合 + if(A[i]%2==1){ + while(A[cur]%2==1) cur+=2; + int temp = A[cur]; + A[cur] = A[i]; + A[i] = temp; + } + } + return A; + } +} diff --git a/code/lc923.java b/code/lc923.java new file mode 100644 index 0000000000000000000000000000000000000000..44c0a32b097d1e1886091c155c33b9b8d581daca --- /dev/null +++ b/code/lc923.java @@ -0,0 +1,73 @@ +package code; +import java.util.Arrays; +import java.util.HashMap; + +/* + * 923. 3Sum With Multiplicity + * 题意:3Sum有几种?数组中有重复数字 + * 难度:Medium + * 分类:Two Pointers + * 思路:由于本题只要求给出多少种Int值,所以不一定非要用3Sum的思路,有很多更简答的方法 + * 3种思路 + * Tips: + */ +public class lc923 { + public int threeSumMulti(int[] A, int target) { + int res = 0; + HashMap hm = new HashMap(); + for (int i = 0; i < A.length ; i++) { + res = (res+hm.getOrDefault(target-A[i],0))%1000000007; // i之前的数字,两个组合起来,是否 == target-A[i] + for (int j = 0; j < i ; j++) { + hm.put(A[i]+A[j], hm.getOrDefault(A[i]+A[j], 0)+1); + } + } + return res; + } + public int threeSumMulti2(int[] A, int target) { //3Sum的思路 + int res = 0; + Arrays.sort(A); + for (int i = 0; i < A.length-2 ; i++) { + int left = i+1, right = A.length-1; + while(lefttarget) right--; + else if(A[left]==A[right]) { //如果相等,则直接 C N 取 2,计算出来,然后break + res = (res + (right-left)*(right-left+1)/2)%1000000007; + break; //不用继续移动指针了 + } else { + int leftcount = 1, rightcount = 1; + while(A[left]==A[left+1]) { + left++; + leftcount++; + } + while(A[right]==A[right-1]) { + right--; + rightcount++; + } + res = (res + leftcount*rightcount)%1000000007; + left++; //别忘了,最后还要操作一下 + right--; + } + } + } + return res; + } + + public int threeSumMulti3(int[] A, int target) { //直接数学计算 + long[] c = new long[101]; + for (int a : A) c[a]++; + long res = 0; + for (int i = 0; i <= 100; i++) // 题目给了值不超过100 + for (int j = i; j <= 100; j++) { + int k = target - i - j; + if (k > 100 || k < 0) continue; + if (i == j && j == k) + res += c[i] * (c[i] - 1) * (c[i] - 2) / 6; + else if (i == j && j != k) + res += c[i] * (c[i] - 1) / 2 * c[k]; + else if (j < k) + res += c[i] * c[j] * c[k]; + } + return (int)(res % (1e9 + 7)); + } +} diff --git a/code/lc978.java b/code/lc978.java new file mode 100644 index 0000000000000000000000000000000000000000..b51ba2fe9b55b74ced3569dd036884d8af2d50af --- /dev/null +++ b/code/lc978.java @@ -0,0 +1,28 @@ +package code; +/* + * 978. Longest Turbulent Subarray + * 题意:小,大,小,大 这种最大长度是多少 + * 难度:Medium + * 分类:Array, Dynamic Porgramming, Sliding Windows + * 思路:O(n) 遍历一遍就能解决,不用dp + * Tips:lc53 + */ +public class lc978 { + public int maxTurbulenceSize(int[] A) { + int inc = 1, dec = 1, result = 1; + for (int i = 1; i < A.length; i++) { + if (A[i] < A[i - 1]) { // +1 并且重置另一个统计量 + dec = inc + 1; + inc = 1; + } else if (A[i] > A[i - 1]) { + inc = dec + 1; + dec = 1; + } else { + inc = 1; + dec = 1; + } + result = Math.max(result, Math.max(dec, inc)); + } + return result; + } +} diff --git a/readme.md b/readme.md index 04d96b2f598e1ff9dbfb552c4c18644104761775..6de0c759be2d484ff1ce401ca1f543501fee7eaa 100644 --- a/readme.md +++ b/readme.md @@ -98,6 +98,7 @@ LeetCode 指南 | 104 [Java](./code/lc104.java) | 105 [Java](./code/lc105.java) | 108 [Java](./code/lc108.java) +| 112 [Java](./code/lc112.java) | 113 [Java](./code/lc113.java) | 114 [Java](./code/lc114.java) | 116 [Java](./code/lc116.java) @@ -111,6 +112,7 @@ LeetCode 指南 | 125 [Java](./code/lc125.java) | 127 [Java](./code/lc127.java) | 128 [Java](./code/lc128.java) +| 129 [Java](./code/lc129.java) | 130 [Java](./code/lc130.java) | 131 [Java](./code/lc131.java) | 134 [Java](./code/lc134.java) @@ -126,6 +128,7 @@ LeetCode 指南 | 148 [Java](./code/lc148.java) | 149 [Java](./code/lc149.java) | 150 [Java](./code/lc150.java) +| 151 [Java](./code/lc151.java) | 152 [Java](./code/lc152.java) | 155 [Java](./code/lc155.java) | 160 [Java](./code/lc160.java)