Skip to content

Commit 308e2cd

Browse files
committed
modify code
1 parent 97b55d0 commit 308e2cd

5 files changed

+37
-5
lines changed
Binary file not shown.

src/class083/Code01_MaximumProfitInJobScheduling.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@ public static int jobScheduling(int[] startTime, int[] endTime, int[] profit) {
2424
jobs[i][1] = endTime[i];
2525
jobs[i][2] = profit[i];
2626
}
27+
// 工作按照结束时间从小到大排序
2728
Arrays.sort(jobs, 0, n, (a, b) -> a[1] - b[1]);
2829
dp[0] = jobs[0][2];
2930
for (int i = 1, start; i < n; i++) {
30-
dp[i] = jobs[i][2];
3131
start = jobs[i][0];
32+
dp[i] = jobs[i][2];
3233
if (jobs[0][1] <= start) {
3334
dp[i] += dp[find(i - 1, start)];
3435
}

src/class083/Code02_KInversePairsArray.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class Code02_KInversePairsArray {
1414
// 不优化枚举
1515
public static int kInversePairs1(int n, int k) {
1616
int mod = 1000000007;
17+
// dp[i][j] : 1、2、3...i这些数字,形成的排列一定要有j个逆序对,请问这样的排列有几种
1718
int[][] dp = new int[n + 1][k + 1];
1819
dp[0][0] = 1;
1920
for (int i = 1; i <= n; i++) {
@@ -24,6 +25,7 @@ public static int kInversePairs1(int n, int k) {
2425
dp[i][j] = (dp[i][j] + dp[i - 1][p]) % mod;
2526
}
2627
} else {
28+
// i <= j
2729
for (int p = j - i + 1; p <= j; p++) {
2830
dp[i][j] = (dp[i][j] + dp[i - 1][p]) % mod;
2931
}
@@ -49,6 +51,7 @@ public static int kInversePairs2(int n, int k) {
4951
if (i > j) {
5052
window = (window + dp[i - 1][j]) % mod;
5153
} else {
54+
// i <= j
5255
window = ((window + dp[i - 1][j]) % mod - dp[i - 1][j - i] + mod) % mod;
5356
}
5457
dp[i][j] = window;

src/class083/Code03_FreedomTrail.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,32 +50,48 @@ public static int findRotateSteps(String r, String k) {
5050
return f(0, 0);
5151
}
5252

53+
// 指针当前指着轮盘i位置的字符,要搞定key[j....]所有字符,最小代价返回
5354
public static int f(int i, int j) {
5455
if (j == m) {
56+
// key长度是m
57+
// 都搞定
5558
return 0;
5659
}
5760
if (dp[i][j] != -1) {
5861
return dp[i][j];
5962
}
6063
int ans;
6164
if (ring[i] == key[j]) {
65+
// ring b
66+
// i
67+
// key b
68+
// j
6269
ans = 1 + f(i, j + 1);
6370
} else {
71+
// 轮盘处在i位置,ring[i] != key[j]
72+
// jump1 : 顺时针找到最近的key[j]字符在轮盘的什么位置
73+
// distance1 : 从i顺时针走向jump1有多远
6474
int jump1 = clock(i, key[j]);
75+
int distance1 = (jump1 > i ? (jump1 - i) : (n - i + jump1));
76+
// jump2 : 逆时针找到最近的key[j]字符在轮盘的什么位置
77+
// distance2 : 从i逆时针走向jump2有多远
6578
int jump2 = counterClock(i, key[j]);
66-
int p1 = (jump1 > i ? (jump1 - i) : (n - i + jump1)) + f(jump1, j);
67-
int p2 = (i > jump2 ? (i - jump2) : (i + n - jump2)) + f(jump2, j);
68-
ans = Math.min(p1, p2);
79+
int distance2 = (i > jump2 ? (i - jump2) : (i + n - jump2));
80+
ans = Math.min(distance1 + f(jump1, j), distance2 + f(jump2, j));
6981
}
7082
dp[i][j] = ans;
7183
return ans;
7284
}
7385

86+
// 从i开始,顺时针找到最近的v在轮盘的什么位置
7487
public static int clock(int i, int v) {
7588
int l = 0;
89+
// size[v] : 属于v这个字符的下标有几个
7690
int r = size[v] - 1, m;
91+
// sorted[0...size[v]-1]收集了所有的下标,并且有序
7792
int[] sorted = where[v];
7893
int find = -1;
94+
// 有序数组中,找>i尽量靠左的下标
7995
while (l <= r) {
8096
m = (l + r) / 2;
8197
if (sorted[m] > i) {
@@ -85,6 +101,8 @@ public static int clock(int i, int v) {
85101
l = m + 1;
86102
}
87103
}
104+
// 找到了就返回
105+
// 没找到,那i顺指针一定先走到最小的下标
88106
return find != -1 ? sorted[find] : sorted[0];
89107
}
90108

@@ -93,6 +111,7 @@ public static int counterClock(int i, int v) {
93111
int r = size[v] - 1, m;
94112
int[] sorted = where[v];
95113
int find = -1;
114+
// 有序数组中,找<i尽量靠右的下标
96115
while (l <= r) {
97116
m = (l + r) / 2;
98117
if (sorted[m] < i) {
@@ -102,6 +121,8 @@ public static int counterClock(int i, int v) {
102121
r = m - 1;
103122
}
104123
}
124+
// 找到了就返回
125+
// 没找到,那i逆指针一定先走到最大的下标
105126
return find != -1 ? sorted[find] : sorted[size[v] - 1];
106127
}
107128

src/class083/Code04_LongestSubarraySumNoMoreK.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ public static void main(String[] args) throws IOException {
5151
public static int compute1() {
5252
int[] sums = new int[n + 1];
5353
for (int i = 0, sum = 0; i < n; i++) {
54+
// sum : 0...i范围上,这前i+1个数字的累加和
5455
sum += nums[i];
56+
// sums[i + 1] : 前i+1个,包括一个数字也没有的时候,所有前缀和中的最大值
5557
sums[i + 1] = Math.max(sum, sums[i]);
5658
}
5759
int ans = 0;
@@ -99,10 +101,15 @@ public static int compute2() {
99101
sum += minSums[end];
100102
end = minSumEnds[end] + 1;
101103
}
102-
ans = Math.max(ans, end - i);
103104
if (end > i) {
105+
// 如果end > i,
106+
// 窗口范围:i...end-1,那么窗口有效
107+
ans = Math.max(ans, end - i);
104108
sum -= nums[i];
105109
} else {
110+
// 如果end == i,那么说明窗口根本没扩出来,代表窗口无效
111+
// end来到i+1位置,然后i++了
112+
// 继续以新的i位置做开头去扩窗口
106113
end = i + 1;
107114
}
108115
}

0 commit comments

Comments
 (0)