Skip to content

Commit 34e359c

Browse files
committed
20190703
1 parent 87dc8f8 commit 34e359c

13 files changed

+54
-13
lines changed

code/lc1026.java

+13-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package code;
22
/*
3-
* 1025. Divisor Game
3+
* 1025. Maximum Difference Between Node and Ancestor
44
* 题意:父节点减子节点的绝对值最大
55
* 难度:
66
* 分类:
77
* 思路:自己写的自下向上,返回的时候再计算。
8-
* 可以自顶向下的,到叶子节点计算就可以
8+
* 可以自顶向下的,把路径上的最大值和最小值传到叶子节点,到叶子节点再计算
99
* Tips:
1010
*/
1111
public class lc1026 {
@@ -44,4 +44,15 @@ public int[] helper(TreeNode root){
4444
res[1] = Math.min(Math.min(left[1], right[1]), root.val);
4545
return res;
4646
}
47+
48+
public int maxAncestorDiff2(TreeNode root) {
49+
return dfs(root, root.val, root.val);
50+
}
51+
52+
public int dfs(TreeNode root, int mn, int mx) {
53+
if (root == null) return mx - mn;
54+
mx = Math.max(mx, root.val);
55+
mn = Math.min(mn, root.val);
56+
return Math.max(dfs(root.left, mn, mx), dfs(root.right, mn, mx));
57+
}
4758
}

code/lc1094.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* 题意:
55
* 难度:Medium
66
* 分类:
7-
* 思路:lc56 类似的题,但该题的集合没有传递覆盖的特性,所以遍历的时候又加了个循环,N^2
7+
* 思路: lc56 类似的题,但该题的集合没有传递覆盖的特性,所以遍历的时候又加了个循环,N^2
88
* 非常巧妙的方法,每次记录上车,下车人数,然后遍历一遍进行模拟上下车
99
* Tips:lc253, lc56
1010
*/

code/lc124.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* 分类:Tree, Depth-first Search
77
* 思路:因为二叉树只有两个节点,一条路径可以想象成倒V字,从低层的某个节点一路向上,到达一个顶点,再一路向下,理解了这一点,整道题就好解了。
88
* Tips:用了一个全局变量存储最后结果,因为函数返回的是直线路径上的最优解,而不是V字路径最优解
9-
* lc112, lc113, lc437, lc129, lc124, lc337, lc543
9+
* lc112, lc113, lc437, lc129, lc124, lc337, lc543, lc1026
1010
*/
1111
public class lc124 {
1212
public class TreeNode {

code/lc146.java

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
* 分类:Design
77
* 思路:hashmap + 双向链表。hashmap实现了O(1)的get,双向链表实现O(1)的put
88
* Tips:能想到双向链表,就不难了
9+
* lc380
910
*/
1011
import java.util.HashMap;
1112

code/lc297.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
* 难度:Hard
1111
* 分类:Tree, Design
1212
* 思路:
13-
* Tips:
13+
* Tips:lc572 序列化的应用
1414
*/
1515
public class lc297 {
1616
public class TreeNode {

code/lc378.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
/*
77
* 378. Kth Smallest Element in a Sorted Matrix
8-
* 题意:在矩阵中搜索第k大的数,横轴和纵轴都是有序的
8+
* 题意:在矩阵中搜索第k小的数,横轴和纵轴都是有序的
99
* 难度:Medium
1010
* 分类:Binary Search, Heap
1111
* 思路:两种思路。 1是类似多个有序链表合并的思路,优先队列。

code/lc380.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
* 难度:Medium
1111
* 分类:Array, Hash Table, Design
1212
* 思路:List 的插入和删除都是O(1), 通过hashmap绑定来使得Get也为O(1)
13-
* Tips:
13+
* Tips:和LRU哪个题类似 lc146
1414
*/
1515
public class lc380 {
1616
public class RandomizedSet {

code/lc395.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,21 @@ public class lc395 {
1313
public int longestSubstring(String s, int k) {
1414
int res = 0;
1515
for (int i = 1; i <= 26 ; i++) {
16-
int left = 0, right = 0, cur_uni_char = 0, less_than_k_char = 0;
16+
int left = 0, right = 0, cur_uni_char = 0, more_than_k_char = 0;
1717
int[] map = new int[26];
1818
while(right<s.length()){ //右边推进
1919
map[s.charAt(right)-'a']++;
20-
if(map[s.charAt(right)-'a']==k) less_than_k_char++;
20+
if(map[s.charAt(right)-'a']==k) more_than_k_char++;
2121
if(map[s.charAt(right)-'a']==1) cur_uni_char++;
2222
right++;
2323

24-
if( cur_uni_char==i && less_than_k_char==i) res = Math.max(res, right-left);
24+
if( cur_uni_char==i && more_than_k_char==i) res = Math.max(res, right-left);
2525

2626
else if(cur_uni_char>i){ //左边推进。不在外边加上一个循环的话,就不知道怎么推荐左指针了。
2727
while(cur_uni_char!=i){
2828
map[s.charAt(left)-'a']--;
2929
if(map[s.charAt(left)-'a']==0) cur_uni_char--;
30-
if((map[s.charAt(left)-'a']==k-1)) less_than_k_char--;
30+
if((map[s.charAt(left)-'a']==k-1)) more_than_k_char--;
3131
left++;
3232
}
3333
}

code/lc416.java

+3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
* 难度:Medium
88
* 分类:Dynamic Programming
99
* 思路:题意可以转换为用任意个元素组成的和等于数组和/2。可以和 lc1, lc15 3-Sum 对比。
10+
* dfs过不了,2^n
1011
* 0,1背包问题,递推比较简单,所以空间可以压缩成一维
1112
* 自己想的思路其实和压缩后的0,1背包类似,但没想到该问题可以抽象为0,1背包
1213
* dp[i][j] = dp[i-1][j] || dp[i-1][j-nums[i]]
@@ -67,4 +68,6 @@ public boolean canPartition2(int[] nums) {
6768
}
6869
return dp[volumn];
6970
}
71+
72+
7073
}

code/lc437.java

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
* 和lc560有共同的思想,每个节点只需遍历一遍就可以了
1414
* 虽然是Easy题,做好也不简单
1515
* lc112, lc113, lc437, lc129, lc124, lc337
16+
* lc437 lc572 一样的递归思路
1617
* lc303, lc437, lc560
1718
*/
1819
public class lc437 {

code/lc572.java

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
* 分类:Tree
77
* 思路:两种方法,一种是先序遍历,然后比较字符串即可,注意每个节点开始前加个字符,null也要加进去。
88
* 另一种递归的方法。
9+
* lc437 lc572 一样的递归思路
10+
* lc297 序列化
911
* Tips:
1012
*/
1113
public class lc572 {

code/lc921.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* 难度:Medium
88
* 分类:Stack, Greedy
99
* 思路:匹配的都出栈,最后剩下的栈中没匹配的个数,就是需要添加的个数
10-
* Tips:
10+
* Tips:lc301
1111
*/
1212
public class lc921 {
1313
public int minAddToMakeValid(String S) {

code/lc978.java

+24-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Tips:lc53
99
*/
1010
public class lc978 {
11-
public int maxTurbulenceSize(int[] A) {
11+
public int maxTurbulenceSize(int[] A) { //太难想了
1212
int inc = 1, dec = 1, result = 1;
1313
for (int i = 1; i < A.length; i++) {
1414
if (A[i] < A[i - 1]) { // +1 并且重置另一个统计量
@@ -25,4 +25,27 @@ public int maxTurbulenceSize(int[] A) {
2525
}
2626
return result;
2727
}
28+
29+
public int maxTurbulenceSize2(int[] A) {
30+
int[] arr = new int[A.length-1];
31+
for(int i=1; i<A.length; i++){
32+
if(A[i]==A[i-1]) arr[i-1] = 0;
33+
else if(A[i]>A[i-1]) arr[i-1] = 1;
34+
else arr[i-1] = -1;
35+
}
36+
int res = 1;
37+
boolean flag = false; //判断下是否全是0, 返回的时候就不+1
38+
int count = 1;
39+
for(int i=1; i<arr.length; i++){
40+
if(arr[i]!=0) flag=true;
41+
if(arr[i]==-arr[i-1] && arr[i]!=0) {
42+
count++;
43+
}else{
44+
res = Math.max(res, count);
45+
count = 1;
46+
}
47+
}
48+
res = Math.max(res, count);
49+
return flag? res+1: res;
50+
}
2851
}

0 commit comments

Comments
 (0)