Skip to content

Commit 860042f

Browse files
committedDec 5, 2019
20191215
1 parent d58778f commit 860042f

17 files changed

+111
-20
lines changed
 

‎code/lc145.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ public class TreeNode {
2020
}
2121
public List<Integer> postorderTraversal(TreeNode root) {
2222
ArrayList<Integer> res = new ArrayList();
23-
if(root==null)
24-
return res;
23+
if(root==null) return res;
2524
Stack<TreeNode> st = new Stack();
2625
while(!st.isEmpty()||root!=null){
2726
while(root!=null) {

‎code/lc152.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public static int maxProduct(int[] nums) {
1919
max = Math.max(nums[i],nums[i]*max);
2020
min = Math.min(nums[i],nums[i]*min);
2121
}else{
22-
int temp = max; //注意maxh会被替换,先保存下
22+
int temp = max; //注意max会被替换,先保存下
2323
max = Math.max(nums[i],nums[i]*min);
2424
min = Math.min(nums[i],nums[i]*temp);
2525
}

‎code/lc221.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ public static void main(String[] args) {
1313
System.out.println(maximalSquare(matrix));
1414
}
1515
public static int maximalSquare(char[][] matrix) {
16-
if(matrix.length==0)
17-
return 0;
16+
if(matrix.length==0) return 0;
1817
int[][] dp = new int[matrix.length][matrix[0].length];
1918
int max = 0;
2019
for (int i = 0; i < matrix.length ; i++) {

‎code/lc239.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
* 思路:用双向队列,保证队列里是递减的。单调队列,好好学习一下。
88
* Tips:与lc84做比较,84是递增栈
99
*/
10-
import java.util.ArrayDeque;
1110
import java.util.Deque;
11+
import java.util.LinkedList;
1212

1313
public class lc239 {
1414
public static void main(String[] args) {
@@ -25,7 +25,7 @@ public static int[] maxSlidingWindow(int[] nums, int k) {
2525
return new int[]{};
2626
int[] res = new int[nums.length-k+1];
2727
int cur = 0;
28-
Deque<Integer> dq = new ArrayDeque(); //队列里是递减的,存的仍然是下标
28+
Deque<Integer> dq = new LinkedList(); //队列里是递减的,存的仍然是下标
2929
for (int i = 0; i < nums.length ; i++) {
3030
if( !dq.isEmpty() && dq.peekFirst()<=i-k) //窗口长度过长了,删掉头
3131
dq.removeFirst();

‎code/lc31.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@
66
* 分类:Array
77
* 思路:从后往前找第一个变小的数x,从后往前找出比第一个x大的数,交换,再把之后的数逆序即可
88
* Tips:很典型的排列组合题,思路方法记忆一下。注意比较时是否有=。
9+
* https://leetcode.com/problems/next-permutation/solution/
10+
*
11+
* 1584 76531
12+
* 1585 13467
913
*/
1014
public class lc31 {
1115
public static void main(String[] args) {
12-
int[] nums = {1,2,3};
16+
int[] nums = {1,5,8,4,7,6,5,3,1};
1317
nextPermutation(nums);
1418
for (int i:nums){
1519
System.out.println(i);
@@ -25,7 +29,7 @@ public static void nextPermutation(int[] nums) {
2529
}
2630
ptr--;
2731
if(ptr!=-1){
28-
//从后往前,找比
32+
//从后往前找出比第一个x大的数
2933
int val = nums[ptr];
3034
int ptr2 = nums.length-1;
3135
while(ptr2>ptr){

‎code/lc322.java

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
* 分类:Dynamic Programming
77
* 思路:和lc279一样的思路,注意下没解的情况
88
* Tips:不用Set, 加一个dp[0]=0,可以直接递归出结果
9+
* dp[i] 表示组合成总值i的最少零钱数
910
*/
1011
import java.util.Arrays;
1112
import java.util.HashSet;

‎code/lc324.java

-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ private void swap(int[] nums, int i, int j) {
3939
}
4040

4141
public int findMedium(int[] nums, int left, int right, int k){
42-
int cur = nums[left];
4342
int l = left;
4443
int r = right;
4544
while(left<right){

‎code/lc39.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ public static void main(String[] args) {
2020
}
2121
public static List<List<Integer>> combinationSum(int[] candidates, int target) {
2222
List<List<Integer>> res = new ArrayList<List<Integer>>();
23-
if(candidates.length==0||target==0)
24-
return res;
23+
if(candidates.length==0||target==0) return res;
2524
List<Integer> l = new ArrayList<Integer>();
2625
backtracking(res,candidates,target,l,0,0);
2726
return res;

‎code/lc542.java

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package code;
2+
/*
3+
* 542. 01 Matrix
4+
* 题意:0,1矩阵,每个点找离自己最近的0的距离
5+
* 难度:Medium
6+
* 分类:Depth-first Search, Breadth-first Search
7+
* 思路:广度优先搜索
8+
* Tips:
9+
*/
10+
import java.util.LinkedList;
11+
import java.util.Queue;
12+
13+
public class lc542 {
14+
public int[][] updateMatrix(int[][] matrix) {
15+
Queue<int[]> qu = new LinkedList();
16+
for(int i=0; i<matrix.length; i++){
17+
for(int j=0; j<matrix[0].length; j++){
18+
if(matrix[i][j]==0){
19+
qu.add(new int[]{i,j});
20+
}
21+
else matrix[i][j]=Integer.MAX_VALUE;
22+
}
23+
}
24+
25+
int[][] dirs = {{-1,0},{1,0},{0,-1},{0,1}};
26+
while(!qu.isEmpty()){
27+
int[] cell = qu.remove();
28+
for(int i=0; i<4; i++){
29+
int cur_row = cell[0]+dirs[i][0];
30+
int cur_col = cell[1]+dirs[i][1];
31+
if(cur_row<0||cur_row>=matrix.length||cur_col<0||cur_col>=matrix[0].length||matrix[cur_row][cur_col]<=matrix[cell[0]][cell[1]]+1) continue;
32+
matrix[cur_row][cur_col] = matrix[cell[0]][cell[1]]+1;
33+
qu.add(new int[]{cur_row,cur_col});
34+
}
35+
}
36+
return matrix;
37+
}
38+
}

‎code/lc685.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* 思路:要把问题想清楚
88
* 判断是否有某个节点父节点有两个, 记为e1, e2
99
* 再判断是否有环
10-
* 4中情况,分别想清楚返回什么
10+
* 4种情况,分别想清楚返回什么
1111
* 自己没想清楚两种情况的交叉,以为判断完第一步就可直接返回
1212
* 如何判断有环,可以利用并查集的思想
1313
* Tips:https://leetcode.com/problems/redundant-connection-ii/discuss/108045/C%2B%2BJava-Union-Find-with-explanation-O(n)

‎code/lc87.java

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package code;
2+
/*
3+
* 87. Scramble String
4+
* 题意:把字符串写成二叉树的形式,问是否可以交换非叶子节点的左右孩子,生成新的字符串
5+
* 难度:Hard
6+
* 分类:String, Dynamic Programming
7+
* 思路:递归的方法,判断交换两段是否满足
8+
* Tips:注意先判断两个字符串是否字符一样,用map的方法,否则长的字符串会超时
9+
*/
10+
public class lc87 {
11+
public boolean isScramble(String s1, String s2) {
12+
if(s1.equals(s2)) return true;
13+
if(s1.length()!=s2.length()) return false;
14+
int[] cur_map = new int[26];
15+
for(int i=0; i<s1.length(); i++){
16+
cur_map[s1.charAt(i)-'a']++;
17+
cur_map[s2.charAt(i)-'a']--;
18+
}
19+
for(int i=0; i<26; i++) if(cur_map[i]!=0) return false;
20+
for(int i=1; i<s1.length(); i++){
21+
if( isScramble(s1.substring(0,i), s2.substring(0,i)) && isScramble(s1.substring(i), s2.substring(i))) return true;
22+
if( isScramble(s1.substring(0,i), s2.substring(s1.length()-i)) && isScramble(s1.substring(i), s2.substring(0,s1.length()-i))) return true;
23+
}
24+
return false;
25+
}
26+
}

‎code/lc912.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*/
1111
public class lc912 {
1212
public static void main(String[] args) {
13-
int[] arr = sortArray2(new int[]{5,2,3,1});
13+
int[] arr = sortArray3(new int[]{5,2,3,1});
1414
for(int i: arr){
1515
System.out.println(i);
1616
}
@@ -80,7 +80,7 @@ public static void merge(int[] nums, int left, int mid, int right){
8080
}
8181

8282
//堆排
83-
public int[] sortArray3(int[] nums) {
83+
public static int[] sortArray3(int[] nums) {
8484
//建堆
8585
int pos = nums.length/2;
8686
while(pos>=0){
@@ -100,7 +100,7 @@ public int[] sortArray3(int[] nums) {
100100
return nums;
101101
}
102102

103-
public void AdjustTree(int[] nums, int len, int pos){ //调整堆
103+
public static void AdjustTree(int[] nums, int len, int pos){ //调整堆
104104
int pos_exchange = pos*2+1;
105105
while(pos_exchange<=len){ //left
106106
if(pos_exchange+1<=len&&nums[pos_exchange+1]>nums[pos_exchange]){ //比较左右节点,挑出来大的

‎code/lc94.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ public class TreeNode {
2020
}
2121
public List<Integer> inorderTraversal(TreeNode root) {
2222
List<Integer> res = new ArrayList<>();
23-
if(root==null)
24-
return res;
23+
if(root==null) return res;
2524
Stack<TreeNode> st = new Stack();
2625
while( !st.isEmpty() || root!=null ) { //注意停止条件
2726
while (root != null) {

‎code/lc95.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* 难度:Medium
1010
* 分类:Dynamic Programming, Tree
1111
* 思路:96只要求计算数量,dp就行,当要把所有情况都输出的时候,往往递归更方便一些
12-
* 返回的的是跟的List,不用把整颗数的节点都复制了,所以下层的叶子节点是被多个父节点指向
12+
* 返回的的是根的List,不用把整颗数的节点都复制了,所以下层的叶子节点是被多个父节点指向
1313
* 暴力,子情况被计算了多遍,为什么不用mem呢???
1414
* Tips:lc96
1515
*/

‎code/lc97.java

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package code;
2+
/*
3+
* 97. Interleaving String
4+
* 题意:两个字符串,穿插成第三个字符串
5+
* 难度:Hard
6+
* 分类:String, Dynamic Programming
7+
* 思路:递归+记忆;动态规划
8+
* Tips:dp空间还可以压缩
9+
* 注意字符串下标index
10+
*/
11+
public class lc97 {
12+
public boolean isInterleave(String s1, String s2, String s3) {
13+
if(s1.length()+s2.length()!=s3.length()) return false;
14+
boolean[][] dp = new boolean[s1.length()+1][s2.length()+1];
15+
for(int i=0; i<=s1.length(); i++){ //从0到<=
16+
for(int j=0; j<=s2.length(); j++){
17+
if(i==0&&j==0) dp[i][j]=true;
18+
else if(i==0) dp[i][j] = (s3.charAt(i+j-1)==s2.charAt(j-1)&&dp[i][j-1]); //注意减一
19+
else if(j==0) dp[i][j] = (s3.charAt(i+j-1)==s1.charAt(i-1)&&dp[i-1][j]);
20+
else dp[i][j] = s3.charAt(i+j-1)==s2.charAt(j-1)&&dp[i][j-1] || s3.charAt(i+j-1)==s1.charAt(i-1)&&dp[i-1][j];
21+
}
22+
}
23+
return dp[s1.length()][s2.length()];
24+
}
25+
}

‎code/lc983.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* 思路:猛一看题,感觉很难
88
* 想了以后,会发现就是典型的数组dp,难的地方主要在于数组不代表每天,如何把days中的天全部覆盖到
99
* 方法是将days转换为一个365长的arr,代表每一天
10-
* 如果这一天不在days中,则 dp[i] = dp[i-1], 否则 dp[i] = min(d p[i-1]+cost , dp[i-2]+cost ,dp[i-7]+cost )
10+
* 如果这一天不在days中,则 dp[i] = dp[i-1], 否则 dp[i] = min(dp[i-1]+cost , dp[i-2]+cost ,dp[i-7]+cost )
1111
* Tips:
1212
*/
1313
public class lc983 {

‎readme.md

+2
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,13 @@ LeetCode 指南
8686
| 079 [Java](./code/lc79.java)
8787
| 084 [Java](./code/lc84.java)
8888
| 085 [Java](./code/lc85.java)
89+
| 087 [Java](./code/lc87.java)
8990
| 088 [Java](./code/lc88.java)
9091
| 091 [Java](./code/lc91.java)
9192
| 094 [Java](./code/lc94.java)
9293
| 095 [Java](./code/lc95.java)
9394
| 096 [Java](./code/lc96.java)
95+
| 097 [Java](./code/lc97.java)
9496
| 098 [Java](./code/lc98.java)
9597
| 100 [Java](./code/lc100.java)
9698
| 101 [Java](./code/lc101.java)

0 commit comments

Comments
 (0)
Please sign in to comment.