Skip to content

Commit 143c2e9

Browse files
committed
update
2 parents b4e8ccd + b469d25 commit 143c2e9

25 files changed

+2655
-2212
lines changed

‎README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ node script deploy.sh
6060

6161
## 🔐 Problems & Solutions
6262

63-
完成进度([948](./TOC-By-ID.md)🔑/ [2407](https://leetcode-cn.com/problemset/all/)🔒)
63+
完成进度([1022](./TOC-By-ID.md)🔑/ [2633](https://leetcode-cn.com/problemset/all/)🔒)
6464

6565
- 🔗 [标签查找](./TOC-By-Tag.md)
6666

‎TOC-By-ID.md‎

Lines changed: 563 additions & 541 deletions
Large diffs are not rendered by default.

‎TOC-By-Tag.md‎

Lines changed: 1643 additions & 1611 deletions
Large diffs are not rendered by default.

‎algorithms/1-100/16.3sum-closest.md‎

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
1-
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
21

3-
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
42

5-
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
3+
### 排序 + 双指针
64

7-
----
85

9-
思路
10-
11-
排序 + 双指针
126

137
本题目因为要计算三个数,如果靠暴力枚举的话时���复杂度会到 O(n^3),需要降低时间复杂度
148

@@ -22,6 +16,41 @@
2216

2317
总时间复杂度:O(logn) + O(n^2) = O(n^2)
2418

19+
20+
21+
### 代码实现
22+
23+
java
24+
25+
```java
26+
class Solution {
27+
public int threeSumClosest(int[] nums, int t) {
28+
Arrays.sort(nums);
29+
int n = nums.length;
30+
int min = 0x3f3f3f3f;
31+
int res = 0x3f3f3f3f;
32+
for (int d = 0; d < n; d++) {
33+
for (int i = d + 1, j = n - 1; i < j; ) {
34+
int sum = nums[d] + nums[i] + nums[j];
35+
if (Math.abs(sum - t) < min) {
36+
res = sum;
37+
min = Math.abs(sum - t);
38+
}
39+
if (sum > t) j--;
40+
else i++;
41+
}
42+
}
43+
44+
return res;
45+
46+
}
47+
}
48+
```
49+
50+
51+
52+
Javascript
53+
2554
```javascript
2655
var threeSumClosest = function (nums, target) {
2756
nums = nums.sort((a, b) => a - b)

‎algorithms/1-100/53.maximum-subarray.md‎

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,15 @@ public:
4949

5050
dp问题思考方式
5151

52-
1. 状态表示 f[i]
53-
1. 集合 所有以i结尾的子序列
54-
2. 属性:Max/Min/数量 f[i]的最大值
55-
2. 状态计算 -- 集合的划分 f(i) = Math.max(f(i-1)+ nums[i], 0)
52+
- 状态表示`f[i]`
53+
- 所有以i结尾的子数组
54+
- 属性:Max/Min/数量 `f[i]`的最大值
55+
- 状态计算
56+
- `f(i) = Math.max(f(i-1)+ nums[i], 0)`
5657

57-
### 代码实现
5858

5959

60-
cpp
60+
### 代码实现
6161

6262
```cpp
6363
class Solution {
@@ -71,3 +71,8 @@ public:
7171
}
7272
};
7373
```
74+
75+
76+
77+
78+

‎algorithms/1-100/54.spiral-matrix.md‎

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,20 @@
2626
---
2727

2828

29+
30+
## 算法思路
31+
32+
33+
34+
- 定义方向
35+
- 二维矩阵边界处理
36+
- 已遍历位置判断:floodfilled填充原矩阵标识
37+
38+
39+
40+
javascript
41+
42+
2943
```javascript
3044
var spiralOrder = function (matrix) {
3145
if (matrix.length == 0 || matrix[0].length == 0) return []
@@ -52,3 +66,33 @@ var spiralOrder = function (matrix) {
5266
};
5367

5468
```
69+
70+
71+
72+
java
73+
74+
```java
75+
class Solution {
76+
public List<Integer> spiralOrder(int[][] matrix) {
77+
int[] d = {0, 1, 0, -1, 0}; // → ↓ ← ↑
78+
List<Integer> ans = new ArrayList<>();
79+
if (matrix.length == 0) return ans;
80+
int m = matrix.length, n = matrix[0].length;
81+
int i = 0, j = 0, dd = 0, cnt = m * n;
82+
while (cnt-- > 0) {
83+
ans.add(matrix[i][j]);
84+
if ((i == 0 && dd == 3)
85+
|| (i == m - 1 && dd == 1)
86+
|| (j == 0 && dd == 2)
87+
|| (j == n - 1 && dd == 0)
88+
|| matrix[i + d[dd]][j + d[dd + 1]] == 101)
89+
dd = (dd + 1) % 4;
90+
matrix[i][j] = 101;
91+
i += d[dd];
92+
j += d[dd + 1];
93+
}
94+
return ans;
95+
}
96+
}
97+
```
98+
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
## 解题思路
2+
3+
4+
5+
6+
7+
- 有向图的最长路
8+
- 拓扑图 求最长路 => 递推
9+
- 判断单词s是t的前身
10+
- s的长度 + 1 == t的长度
11+
- s是t的子序列
12+
13+
14+
15+
## 代码实现
16+
17+
```java
18+
class Solution {
19+
20+
boolean check(String s, String t) {
21+
if (s.length() + 1 != t.length()) return false;
22+
int i = 0;
23+
for (char c : t.toCharArray()) {
24+
if (i <s.length() && s.charAt(i) == c) i++;
25+
}
26+
return i == s.length();
27+
}
28+
29+
public int longestStrChain(String[] words) {
30+
Arrays.sort(words, new Comparator<String>() {
31+
@Override
32+
public int compare(String o1, String o2) {
33+
return o1.length() - o2.length();
34+
}
35+
});
36+
37+
int res = 1;
38+
39+
int n = words.length;
40+
int[] f = new int[n];
41+
Arrays.fill(f, 1);
42+
43+
for (int i = 0; i < n; i++) {
44+
for (int j = 0; j < i; j++) {
45+
if (check(words[j], words[i])) {
46+
f[i] = Math.max(f[i], f[j] + 1);
47+
}
48+
}
49+
res = Math.max(res, f[i]);
50+
}
51+
return res;
52+
}
53+
54+
}
55+
```
56+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
二分查找

‎algorithms/201-300/224.basic-calculator.md‎

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,22 @@
22

33
字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格  。
44

5-
示例 1:
65

7-
输入: "1 + 1"
8-
输出: 2
9-
示例 2:
106

11-
输入: " 2-1 + 2 "
12-
输出: 3
13-
示例 3:
7+
----
148

15-
输入: "(1+(4+5+2)-3)+(6+8)"
16-
输出: 23
17-
说明:
189

19-
你可以假设所给定的表达式都是有效的。
20-
请不要使用内置的库函数 eval。
2110

22-
来源:力扣(LeetCode)
23-
链接:https://leetcode-cn.com/problems/basic-calculator
24-
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
11+
### 双栈实现
2512

26-
----
13+
14+
15+
一个栈 opStk 存放 操作符,一个栈 numStk存放 数字
16+
17+
18+
19+
20+
21+
- '( ', ’+‘, ’-‘ 入栈
22+
- 数字,opStk出一个操作符,numStk出一个数字,与当前数字计算后,压 numStk
23+
- ’)‘操作符出栈

‎algorithms/201-300/287.find-the-duplicate-number.md‎

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,15 @@
2222

2323
## 哈希判重
2424

25-
空间复杂度O(N),违反了`只能使用额外的 O(1) 的空间`
25+
空间复杂度O(N),违反了`只能使用额外的 O(1) 的空间`的限制
2626

27-
## 抽屉原理
28-
29-
数组中只有一个重复的数字,但它可能不止重复出现一次。
3027

31-
把所有元素放在他的下标处,遇到位置已经被占用的就是所得元素。
32-
33-
但是,违反了`不能更改原数组(假设数组是只读的)`
3428

3529
## 求和
3630

3731
本题只有一个重复元素,但是重复次数不确定,不能求和
3832

3933

40-
4134
## 先排序,再比较相邻元素
4235

4336
改变了原数组
@@ -51,7 +44,19 @@ var findDuplicate = function (nums) {
5144
};
5245
```
5346

54-
## 二分法(分治 + 抽屉原理)
47+
48+
## 抽屉原理
49+
50+
数组中只有一个重复的数字,但它可能不止重复出现一次。
51+
52+
把所有元素放在他的下标处,遇到位置已经被占用的就是所得元素。
53+
54+
但是,违反了`不能更改原数组(假设数组是只读的)`
55+
56+
57+
58+
## 二分查找
59+
5560

5661
这道题目主要应用了抽屉原理和分治的思想。
5762

@@ -65,11 +70,13 @@ var findDuplicate = function (nums) {
6570

6671
依次类推,每次我们可以把区间长度缩小一半,直到区间长度为1时,我们就找到了答案。
6772

68-
复杂度分析
6973

70-
时间复杂度:每次会将区间长度缩小一半,一共会缩小 O(logn) 次。每次统计两个子区间中的数时需要遍历整个数组,时间复杂度是 O(n)。所以总时间复杂度是 O(nlogn)。
7174

72-
空间复杂度:代码中没有用到额外的数组,所以额外的空间复杂度是 O(1)。
75+
#### 复杂度分析
76+
77+
时间复杂度:每次会将区间长度缩小一半,一共会缩小 `O(logn)` 次。每次统计两个子区间中的数时需要遍历整个数组,时间复杂度是 `O(n)`。所以总时间复杂度是 `O(nlogn)`
78+
79+
空间复杂度:代码中没有用到额外的数组,所以额外的空间复杂度是 `O(1)`
7380

7481
```cpp
7582
class Solution {

0 commit comments

Comments
 (0)