提交 71a611aa 编写于 作者: L liu13

20190324

上级 2d9f4774
......@@ -5,6 +5,7 @@ package code;
* 难度:Medium
* 分类:Array, Two Pointers
* 注意:如何避免 List 重复元素
* Tips:lc15, lc16, lc923
*/
import java.util.*;
......
......@@ -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) {
......
......@@ -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) {
......
......@@ -4,7 +4,7 @@ import java.util.HashMap;
/*
* 560. Subarray Sum Equals K
* 题意:子数组的和等于k的个数
* 题意:连续子数组的和等于k的个数
* 难度:Medium
* 分类:Array, Hash Table
* 思路:求出累加和存在hashmap中,如果当前hashmap中存在sum-k,那么就是一个解
......
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<Character> 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();
}
}
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;
}
}
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<Integer, Integer> 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(left<right){
if(A[i]+A[left]+A[right]<target) left++;
else if(A[i]+A[left]+A[right]>target) 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));
}
}
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;
}
}
......@@ -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)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册