Skip to content

Commit ea4ea28

Browse files
committed
20190818
1 parent 4ca0257 commit ea4ea28

23 files changed

+175
-52
lines changed

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
.DS_Store
22
*/.DS_Store
3-
/kickstart/*
3+
kickstart/*
44
test.java
5+
interview/*

code/lc1026.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package code;
22
/*
3-
* 1025. Maximum Difference Between Node and Ancestor
3+
* 1026. Maximum Difference Between Node and Ancestor
44
* 题意:父节点减子节点的绝对值最大
55
* 难度:
66
* 分类:

code/lc105.java

+13
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,17 @@ public static TreeNode recursion(int[] preorder, int[] inorder, int pre_index, i
3737
return tn; //记住函数的返回值的设置,返回Node,递归的构造子树
3838
}
3939

40+
public TreeNode buildTree2(int[] preorder, int[] inorder) {
41+
return helper(preorder, inorder, 0, 0, preorder.length-1);
42+
}
43+
public TreeNode helper(int[] preorder, int[] inorder, int cur, int left, int right){
44+
if(left>right) return null;
45+
TreeNode tn = new TreeNode(preorder[cur]);
46+
int i = left;
47+
for(; i<=right; i++) if(inorder[i]==preorder[cur]) break;
48+
tn.left = helper(preorder, inorder, cur+1, left, i-1);
49+
tn.right = helper(preorder, inorder, cur+i-left+1, i+1, right);
50+
return tn;
51+
}
52+
4053
}

code/lc113.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public void helper(List<List<Integer>> res, List<Integer> cur, TreeNode root, in
3333
helper(res, cur, root.left, sum-root.val);
3434
helper(res, cur, root.right, sum-root.val);
3535
}
36-
cur.remove(cur.size()-1);
36+
cur.remove(cur.size()-1); //注意是去掉最后一个,传的是索引。传递对象的话,序列可能会变。
3737
return;
3838
}
3939
}

code/lc148.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,9 @@ public void quickSort(ListNode head, ListNode end) {
7575

7676
public ListNode partion(ListNode head, ListNode end) {
7777
ListNode p1 = head, p2 = head.next;
78-
78+
//p1指的是小于pivot的索引
7979
//走到末尾才停
80-
while (p2 != end) { //p1与p2间都是大于pivot的数
80+
while (p2 != end) { //head到p1间是小于pivot的数,p1与p2间都是大于pivot的数
8181
if (p2.val < head.val) { //lc922 类似的思想, 把小于的值放到该放的位置上
8282
p1 = p1.next;
8383

code/lc149.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class Point {
2020
public int maxPoints(Point[] points) {
2121
if(points.length<=2) return points.length;
2222
int res = 0;
23-
for (int i = 0; i < points.length-1 ; i++) {
23+
for (int i = 0; i < points.length-1 ; i++) {//先固定一个点,再根据斜率进行记录就行了
2424
HashMap<Integer, HashMap<Integer, Integer>> hm = new HashMap<>();
2525
int overlap = 1;
2626
int max = 0;

code/lc153.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public int findMin(int[] nums) {
1616
int mid = (left+right)/2;
1717
if(nums[mid]<nums[right]){
1818
right = mid; //这不加1
19-
}else if(nums[mid]>nums[right]){
19+
}else{
2020
left = mid+1;
2121
}
2222
}

code/lc22.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package code;
22
/*
33
* 22. Generate Parentheses
4-
* 题意:正确括号组合的
4+
* 题意:正确括号组合
55
* 难度:Medium
66
* 分类:String, Backtracking
77
* 思路:回溯法的典型题目,按选优条件向前搜索,达到目标后就退回一步或返回

code/lc236.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,8 @@ public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {//
2323
return root;
2424
TreeNode left = lowestCommonAncestor(root.left, p, q);
2525
TreeNode right = lowestCommonAncestor(root.right, p, q);
26-
if( left!=null && right!=null ) //回溯返回。哪边不为空,返回哪边,否则返回自己。
27-
return root;
28-
else if(left!=null)
29-
return left;
26+
if( left!=null && right!=null ) return root; //回溯返回。哪边不为空,返回哪边,否则返回自己。
27+
else if(left!=null) return left;
3028
else return right;
3129
}
3230

code/lc239.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -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 ArrayDeque(); //队列里是递减的,存的仍然是下标
2929
for (int i = 0; i < nums.length ; i++) {
3030
if( !dq.isEmpty() && dq.peekFirst()<=i-k) //窗口长度过长了,删掉头
3131
dq.removeFirst();

code/lc300.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,8 @@ public int lengthOfLIS2(int[] nums) {
3838
int right = size;
3939
while(left!=right){ //得到要插入的位置
4040
int mid = (left+right)/2;
41-
if(dp[mid]<nums[i])
42-
left = mid+1;
43-
else
44-
right = mid;
41+
if(dp[mid]<nums[i]) left = mid+1; //这是+1记住,不能到else去-1, 会死循环。+1就超出边界,后续用left赋值
42+
else right = mid;
4543
}
4644
dp[left] = nums[i];
4745
if(left==size) size++;

code/lc315.java

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
* 再有一种复杂度稍微高点的思路,从后往前插入排序,插入的时候二分搜索,插入其实是不行的,因为插入操作以后还要移动value位置,又是一个O(N)的操作
1515
* https://leetcode.com/problems/count-of-smaller-numbers-after-self/discuss/76576/My-simple-AC-Java-Binary-Search-code
1616
* Tips:好难呀,我日!
17+
* lc493
1718
*/
1819
public class lc315 {
1920
class TreeNode{

code/lc324.java

+2-20
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public void wiggleSort(int[] nums) {
2020

2121
for (int i = 0, j = 0, k = n - 1; j <= k;) { // <medium的放左边, >在右边
2222
if (copy[j] < median) {
23-
swap(copy, i++, j++);
23+
swap(copy, j++, i++);
2424
} else if (copy[j] > median) {
2525
swap(copy, j, k--);
2626
} else {
@@ -32,27 +32,13 @@ public void wiggleSort(int[] nums) {
3232
for (int i = n - 1, j = 1; i >= m; i--, j += 2) nums[j] = copy[i];
3333
}
3434

35-
36-
37-
private int getMiddle(int[] nums, int l, int r) {
38-
int i = l;
39-
40-
for (int j = l + 1; j <= r; j++) {
41-
if (nums[j] < nums[l]) swap(nums, ++i, j);
42-
}
43-
44-
swap(nums, l, i);
45-
return i;
46-
}
47-
4835
private void swap(int[] nums, int i, int j) {
4936
int t = nums[i];
5037
nums[i] = nums[j];
5138
nums[j] = t;
5239
}
5340

54-
55-
public static int findMedium(int[] nums, int left, int right, int k){
41+
public int findMedium(int[] nums, int left, int right, int k){
5642
int cur = nums[left];
5743
int l = left;
5844
int r = right;
@@ -70,8 +56,4 @@ public static int findMedium(int[] nums, int left, int right, int k){
7056
else if(left>=k) return findMedium(nums, l, right-1, k);
7157
else return findMedium(nums, right+1, r, k);
7258
}
73-
74-
public static int newIndex(int index, int n) {
75-
return (1 + 2*index) % (n | 1);
76-
}
7759
}

code/lc384.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public int[] reset() {
2525
public int[] shuffle() {
2626
int[] rand = new int[nums.length];
2727
for (int i = 0; i < nums.length; i++){
28-
int r = (int) (Math.random() * (i+1));
28+
int r = (int) (Math.random() * (i+1)); // +1是因为下标从0开始
2929
rand[i] = rand[r];
3030
rand[r] = nums[i];
3131
}

code/lc395.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public int longestSubstring(String s, int k) {
2323

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

26-
else if(cur_uni_char>i){ //左边推进。不在外边加上一个循环的话,就不知道怎么推荐左指针了
26+
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--;

code/lc416.java

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
* 0,1背包问题,递推比较简单,所以空间可以压缩成一维
1212
* 自己想的思路其实和压缩后的0,1背包类似,但没想到该问题可以抽象为0,1背包
1313
* dp[i][j] = dp[i-1][j] || dp[i-1][j-nums[i]]
14+
* i表示数组长度,j表示求和为j
1415
* Tips:lc416, lc494
1516
*/
1617
public class lc416 {

code/lc42.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public static int trap2(int[] A) {
5252
int i = 0, maxWater = 0, maxBotWater = 0;
5353
while (i < A.length){
5454
if (s.isEmpty() || A[i]<=A[s.peek()]){
55-
s.push(i++);
55+
s.push(i++); //递减栈
5656
}
5757
else {
5858
int bot = s.pop();

code/lc493.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
* 493. Reverse Pairs
77
* 题意:逆序对
88
* 难度:Hard
9-
* 分类:
9+
* 分类:Binary Search, Divide and Conquer, Sort, Binary Indexed Tree, Segment Tree
1010
* 思路:归并排序的思路 或者 树相关的数据结构
1111
* 排序前先count
1212
* 负数怎么解决? 不用考虑,因为排序前先count
13-
* Tips:
13+
* Tips:lc315
1414
*/
1515
public class lc493 {
1616
public static void main(String[] args) {

code/lc572.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,12 @@ public class TreeNode {
1919
}
2020

2121
public boolean isSubtree(TreeNode s, TreeNode t) {
22-
if (s == null) return false;
23-
return helper(s,t) || isSubtree(s.left,t) ||isSubtree(s.right,t); // 注意递归方法的不同,是调用哪个函数
22+
if( s==null || t==null ) return s==t;
23+
return helper(s,t) || isSubtree(s.left, t) || isSubtree(s.right, t); // 注意递归方法的不同,是调用哪个函数
2424
}
2525
public boolean helper(TreeNode s, TreeNode t){
26-
if( s==null && t==null ) return true;
27-
if( s==null || t==null || s.val!=t.val ) return false;
28-
return helper(s.left, t.left) && helper(s.right, t.right);
26+
if( s==null || t==null ) return s==t;
27+
return s.val==t.val && helper(s.left, t.left) && helper(s.right, t.right);
2928
}
3029

3130
public boolean isSubtree2(TreeNode s, TreeNode t) {

code/lc617.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ public void helper(TreeNode t1, TreeNode t2){
4444
public TreeNode mergeTrees2(TreeNode t1, TreeNode t2) {
4545
if(t1==null) return t2; //这里注意一下,比较难想明白,可以记一下
4646
if(t2==null) return t1;
47-
t1.left = mergeTrees(t1.left, t2.left);
48-
t1.right = mergeTrees(t1.right, t2.right);
47+
t1.left = mergeTrees(t1.left, t2.left); //搞定下层指针
48+
t1.right = mergeTrees(t1.right, t2.right); //前边判断过了,两个都不为null
4949
t1.val += t2.val;
5050
return t1;
5151
}

code/lc84.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ public static int largestRectangleArea(int[] heights) {
2727
if( st.size()==0 || h>heights[st.peek()] ){ //递增入栈,保证栈内索引对应的Height递增
2828
st.push(i);
2929
}else{
30-
int n = st.pop();
30+
int n = st.pop(); //计算该位置height高度的矩形
3131
int left;
3232
if(st.isEmpty())
3333
left = -1; //若为空,则到最左边
3434
else
3535
left = st.peek();
36-
res = Math.max(res, heights[n] * (i-left-1)); //i之前的,要-1
37-
i--;
36+
res = Math.max(res, heights[n] * (i-left-1)); //i之前的,要-1; 注意是height[n], 不是height[i]
37+
i--; //注意i--,相当于循环出栈,总体复杂度还是O(n),因为栈最大是heights.len
3838
}
3939
}
4040
return res;

interview/bk2.java

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package interview;
2+
3+
public class bk2 {
4+
public static void main(String[] args) {
5+
6+
}
7+
8+
public int lengthOfLIS2(int[] nums) {
9+
if(nums.length<2)
10+
return nums.length;
11+
int size = 0; //size指dp中递增的长度。 dp[0~i] 表示了长度为 i+1 的递增子数组,且最后一个值是最小值
12+
int[] dp = new int[nums.length]; //dp存储递增的数组,之后更新这个数组。如果x>最后一个值,则插入到末尾,否则更新对应位置上的值为该值。
13+
for (int i = 0; i < nums.length ; i++) {
14+
int left = 0;
15+
int right = size;
16+
while(left!=right){ //得到要插入的位置
17+
int mid = (left+right)/2;
18+
if(dp[mid]<nums[i])
19+
left = mid+1;
20+
else
21+
right = mid;
22+
}
23+
dp[left] = nums[i];
24+
if(left==size) size++;
25+
}
26+
return size;
27+
}
28+
}

interview/bk4.java

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package interview;
2+
3+
import java.util.Scanner;
4+
5+
public class bk4 {
6+
public static void main(String[] args) {
7+
//int[] arr = new int[]{1,4,3,2,5};
8+
int[] arr = new int[]{1,2,3,4,5,8};
9+
//int[] arr = new int[]{8,7,6,5,4,3};
10+
System.out.println(func(arr));
11+
}
12+
public static int func(int[] arr){
13+
int res = Integer.MAX_VALUE;
14+
for (int i = 0; i < arr.length; i++) {
15+
int cur = 0;
16+
int max1 = -1;
17+
int j = 0;
18+
for (; j < i; j++) {
19+
max1 = Math.max(max1+1, j>0?arr[j-1]:0);
20+
cur += Math.max(max1 - arr[j]+1, 0);
21+
}
22+
max1 = Math.max(max1, j>0?arr[j-1]:0);
23+
int max2 = -1;
24+
j = arr.length-1;
25+
for (; j>i ; j--) {
26+
max2 = Math.max(max2+1, j<arr.length-1?arr[j+1]:0);
27+
cur += Math.max(max2 - arr[j] + 1, 0);
28+
}
29+
max2 = Math.max(max2, j<arr.length-1?arr[j+1]:0);
30+
cur += Math.max(Math.max(max1, max2) + 1 - arr[i], 0);
31+
res = Math.min(res, cur);
32+
}
33+
return res;
34+
}
35+
36+
public static void main2(String[] args) {
37+
Scanner scanner = new Scanner(System.in);
38+
int n = scanner.nextInt();
39+
int [] nums = new int [n];
40+
for(int i = 0; i < n; i ++) {
41+
nums[i] = scanner.nextInt();
42+
}
43+
int [] temp = new int [n];
44+
for(int i = 0; i < n; i ++) {
45+
temp[i] = nums[i];
46+
}
47+
int count = Integer.MAX_VALUE;
48+
int sum = 0;
49+
for(int i = 1; i < n; i ++) {
50+
if(nums[i] <= nums[i - 1]) {
51+
sum += nums[i - 1] + 1 - nums[i];
52+
nums[i] = nums[i - 1] + 1;
53+
}
54+
}
55+
if(sum < count)
56+
count = sum;
57+
for(int i = 0; i < n; i ++) {
58+
nums[i] = temp[i];
59+
}
60+
sum = 0;
61+
for(int j = n - 2; j >= 0 ; j --) {
62+
if(nums[j] <= nums[j + 1]) {
63+
sum += nums[j + 1] + 1 - nums[j];
64+
nums[j] = nums[j + 1] + 1;
65+
}
66+
}
67+
if(sum < count)
68+
count = sum;
69+
for(int i = 0; i < n; i ++) {
70+
nums[i] = temp[i];
71+
}
72+
for(int i = 1; i < n - 1; i ++) {
73+
sum = 0;
74+
int j = 1;
75+
for(; j < i; j ++) {
76+
if(nums[j] <= nums[j - 1]) {
77+
sum += nums[j - 1] + 1 - nums[j];
78+
nums[j] = nums[j - 1] + 1;
79+
}
80+
}
81+
j --;
82+
int k = n - 2;
83+
for(; k > i; k--) {
84+
if(nums[k] <= nums[k + 1]) {
85+
sum += nums[k + 1] + 1 - nums[k];
86+
nums[k] = nums[k + 1] + 1;
87+
}
88+
}
89+
k ++;
90+
int res = Math.max(nums[j], nums[k]);
91+
if(nums[i] <= res) {
92+
sum += res + 1 - nums[i];
93+
}
94+
if(sum < count)
95+
count = sum;
96+
for(int l = 0; l < n; l ++) {
97+
nums[l] = temp[l];
98+
}
99+
}
100+
System.out.println(count);
101+
}
102+
}

0 commit comments

Comments
 (0)