Skip to content

Commit 45481bd

Browse files
author
rchen102
committed
2020/9/23
1 parent 61ea403 commit 45481bd

File tree

4 files changed

+68
-54
lines changed

4 files changed

+68
-54
lines changed

Java/leetcode 10.java

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,42 @@
1+
// Solution: dp T: O(nm) S: O(nm)
12
class Solution {
23
public boolean isMatch(String s, String p) {
34
if (s == null || p == null) return s == p;
4-
// dp table
5-
int len1 = s.length(), len2 = p.length();
6-
boolean[][] dp = new boolean[len1+1][len2+1];
7-
// base case
5+
int n = s.length(), m = p.length();
6+
7+
// dp tables
8+
boolean[][] dp = new boolean[n+1][m+1];
9+
10+
// base cases
11+
// 1. p 是空串, dp[i][0] = false,默认初始化已经是 false 了
12+
// 2. 两个都为空串
813
dp[0][0] = true;
9-
for (int j = 0; j < len2; j++) {
10-
if (p.charAt(j) == '*' && dp[0][j-1]) {
11-
dp[0][j+1] = true;
14+
// 3. s 是空串,p 是 #*#*#*#*...
15+
for (int j = 2; j <= m; j = j+2) {
16+
if (p.charAt(j-1) == '*' && dp[0][j-2]) {
17+
dp[0][j] = true;
1218
}
1319
}
1420

1521
// dp 推导
16-
for (int i = 1; i <= len1; i++) {
17-
for (int j = 1; j <= len2; j++) {
22+
for (int i = 1; i <= n; i++) {
23+
for (int j = 1; j <= m; j++) {
24+
// 1. 正好相等,或者 p 是 . 匹配任意一个
1825
if (s.charAt(i-1) == p.charAt(j-1) || p.charAt(j-1) == '.') {
1926
dp[i][j] = dp[i-1][j-1];
2027
}
2128
if (p.charAt(j-1) == '*') {
22-
// 匹配 0 次
29+
// 2. 完全不匹配
2330
if (s.charAt(i-1) != p.charAt(j-2) && p.charAt(j-2) != '.') {
2431
dp[i][j] = dp[i][j-2];
2532
}
2633
else {
27-
// 匹配 0 或 n 次
28-
dp[i][j] = dp[i-1][j] || dp[i][j-2];
34+
// 3. 匹配 0 个 或者 N 个
35+
dp[i][j] = dp[i][j-2] || dp[i-1][j];
2936
}
3037
}
3138
}
3239
}
33-
return dp[len1][len2];
40+
return dp[n][m];
3441
}
3542
}

Java/leetcode 300.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,20 @@ public int lengthOfLIS(int[] nums) {
2525
int piles = 0;
2626
for (int i = 0; i < nums.length; i++) {
2727
int card = nums[i];
28-
int find = binarySearchLeftBound(tops, piles, card);
29-
if (find == piles) {
30-
piles++;
31-
}
32-
tops[find] = card;
28+
int position = binarySearch(card, tops, piles);
29+
if (position > piles-1) piles++;
30+
tops[position] = nums[i];
3331
}
3432
return piles;
3533
}
3634

37-
public int binarySearchLeftBound(int[] nums, int len, int target) {
38-
int lo = 0, hi = len - 1;
35+
// search range [0...piles-1]
36+
int binarySearch(int card, int[] tops, int piles) {
37+
int lo = 0, hi = piles - 1;
3938
while (lo <= hi) {
4039
int mid = lo + ((hi - lo) >> 1);
41-
if (nums[mid] < target) lo = mid + 1;
42-
else if (nums[mid] > target) hi = mid - 1;
43-
else hi = mid - 1;
40+
if (card > tops[mid]) lo++;
41+
else if (card <= tops[mid]) hi--;
4442
}
4543
return lo;
4644
}

Java/leetcode 416.java

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,35 @@
22
class Solution {
33
public boolean canPartition(int[] nums) {
44
if (nums == null || nums.length == 0) return true;
5-
int len = nums.length;
6-
// 如果和为奇数,肯定分不了
75
int sum = Arrays.stream(nums).sum();
86
if (sum % 2 != 0) return false;
9-
sum = sum/2;
7+
sum = sum / 2;
108

11-
// 初始化 Base case
12-
boolean[][] dp = new boolean[len+1][sum+1];
13-
for (int i = 0; i <= len; i++) {
9+
int n = nums.length;
10+
boolean dp[][] = new boolean[n+1][sum+1];
11+
12+
// base cases
13+
// 1. 可选物品为 0,背包也为 0
14+
dp[0][0] = true;
15+
// 2. 可选物品为 0,背包不为 0,默认 false
16+
// 3. 可选物品不为 0,背包为 0,都为 true
17+
for (int i = 1; i <= n; i++) {
1418
dp[i][0] = true;
1519
}
16-
// 物品为 0 时,无物品可装,注意 dp[0][0] = true
17-
for (int j = 1; j <= sum; j++) {
18-
dp[0][j] = false;
19-
}
20-
// 状态转移
21-
for (int i = 1; i <= len; i++) {
20+
21+
// dp 推导
22+
for (int i = 1; i <= n; i++) {
2223
for (int j = 1; j <= sum; j++) {
23-
// 背包容量不足
24+
// 注意这里是小于,大于等于都可以
2425
if (j < nums[i-1]) {
2526
dp[i][j] = dp[i-1][j];
2627
}
2728
else {
28-
dp[i][j] = dp[i-1][j] || dp[i-1][j - nums[i-1]];
29+
dp[i][j] = dp[i-1][j] || dp[i-1][j-nums[i-1]];
2930
}
3031
}
3132
}
32-
return dp[len][sum];
33+
return dp[n][sum];
3334
}
3435
}
3536

Java/leetcode 72.java

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,41 @@
11
// Solution: 基本 dp T: O(mn) S: O(mn)
22
class Solution {
33
public int minDistance(String word1, String word2) {
4-
if (word1 == null && word2 != null) return word2.length();
5-
if (word2 == null && word1 != null) return word1.length();
6-
if (word1 == null && word2 == null) return 0;
4+
String s = word1, t = word2;
5+
if (s == null && t == null) return 0;
6+
if (s == null && t != null) return t.length();
7+
if (s != null && t == null) return s.length();
78

8-
int n1 = word1.length();
9-
int n2 = word2.length();
10-
int[][] dp = new int[n1+1][n2+1];
11-
// base case
12-
for (int i = 0; i <= n1; i++) {
9+
int n = s.length(), m = t.length();
10+
int[][] dp = new int[n+1][m+1];
11+
// base cases
12+
for (int i = 0; i <= n; i++) {
1313
dp[i][0] = i;
1414
}
15-
for (int j = 0; j <= n2; j++) {
15+
for (int j = 0; j <= m; j++) {
1616
dp[0][j] = j;
1717
}
18-
for (int i = 1; i <= n1; i++) {
19-
for (int j = 1; j <= n2; j++) {
20-
if (word1.charAt(i-1) == word2.charAt(j-1)) {
21-
// 跳过操作,什么也不做
18+
dp[0][0] = 0;
19+
// dp 推导
20+
for (int i = 1; i <= n; i++) {
21+
for (int j = 1; j <= m; j++) {
22+
// 1. 相等,什么都不用做
23+
if (s.charAt(i-1) == t.charAt(j-1)) {
2224
dp[i][j] = dp[i-1][j-1];
2325
}
2426
else {
25-
dp[i][j] = Math.min(dp[i-1][j] + 1, dp[i][j-1] + 1); // 插入或者删除操作
26-
dp[i][j] = Math.min(dp[i][j], dp[i-1][j-1] + 1); // 替换操作
27+
// 2. s 插入字符
28+
dp[i][j] = dp[i][j-1] + 1;
29+
30+
// 3. 删除 s 字符
31+
dp[i][j] = Math.min(dp[i][j], dp[i-1][j] + 1);
32+
33+
// 4. 替换字符
34+
dp[i][j] = Math.min(dp[i][j], dp[i-1][j-1] + 1);
2735
}
2836
}
2937
}
30-
return dp[n1][n2];
38+
return dp[n][m];
3139

3240
}
3341
}

0 commit comments

Comments
 (0)