Skip to content

Commit 318ef96

Browse files
Merge pull request #787 from SharingSource/ac_oier
✨feat: add 1092、1253、1260、1408、1473、1640、1743、1759、1802、236、481、543、6…
2 parents 271b77d + 53402bd commit 318ef96

27 files changed

+1766
-322
lines changed

LeetCode/1091-1100/1092. 最短公共超序列(困难).md

+61-26
Original file line numberDiff line numberDiff line change
@@ -90,36 +90,39 @@ class Solution {
9090
}
9191
}
9292
```
93-
TypeScript 代码:
94-
```TypeScript
95-
function shortestCommonSupersequence(s1: string, s2: string): string {
96-
const n = s1.length, m = s2.length
97-
s1 = " " + s1; s2 = " " + s2
98-
const f = new Array<Array<number>>()
99-
for (let i = 0; i < n + 10; i++) f.push(new Array<number>(m + 10).fill(0))
100-
for (let i = 1; i <= n; i++) {
101-
for (let j = 1; j <= m; j++) {
102-
if (s1[i] == s2[j]) f[i][j] = f[i - 1][j - 1] + 1
103-
else f[i][j] = Math.max(f[i - 1][j], f[i][j - 1])
93+
C++ 代码:
94+
```C++
95+
class Solution {
96+
public:
97+
string shortestCommonSupersequence(string str1, string str2) {
98+
int n = str1.size(), m = str2.size();
99+
str1 = " " + str1; str2 = " " + str2;
100+
vector<vector<int>> f(n + 10, vector<int>(m + 10));
101+
for (int i = 1; i <= n; ++i) {
102+
for (int j = 1; j <= m; ++j) {
103+
if (str1[i] == str2[j])
104+
f[i][j] = f[i - 1][j - 1] + 1;
105+
else
106+
f[i][j] = max(f[i - 1][j], f[i][j - 1]);
107+
}
104108
}
105-
}
106-
let ans = ""
107-
let i = n, j = m
108-
while (i > 0 || j > 0) {
109-
if (i == 0) ans += s2[j--]
110-
else if (j == 0) ans += s1[i--]
111-
else {
112-
if (s1[i] == s2[j]) {
113-
ans += s1[i]
114-
i--; j--
115-
} else if (f[i][j] == f[i - 1][j]) {
116-
ans += s1[i--]
117-
} else {
118-
ans += s2[j--]
109+
string res;
110+
int i = n, j = m;
111+
while (i > 0 || j > 0) {
112+
if (i == 0) res += str2[j--];
113+
else if (j == 0) res += str1[i--];
114+
else {
115+
if (str1[i] == str2[j]) {
116+
res += str1[i];
117+
i--; j--;
118+
}
119+
else if (f[i][j] == f[i - 1][j]) res += str1[i--];
120+
else res += str2[j--];
119121
}
120122
}
123+
reverse(res.begin(), res.end());
124+
return res;
121125
}
122-
return ans.split('').reverse().join('')
123126
};
124127
```
125128
Python 代码:
@@ -155,6 +158,38 @@ class Solution:
155158
j -= 1
156159
return ans[::-1]
157160
```
161+
TypeScript 代码:
162+
```TypeScript
163+
function shortestCommonSupersequence(s1: string, s2: string): string {
164+
const n = s1.length, m = s2.length
165+
s1 = " " + s1; s2 = " " + s2
166+
const f = new Array<Array<number>>()
167+
for (let i = 0; i < n + 10; i++) f.push(new Array<number>(m + 10).fill(0))
168+
for (let i = 1; i <= n; i++) {
169+
for (let j = 1; j <= m; j++) {
170+
if (s1[i] == s2[j]) f[i][j] = f[i - 1][j - 1] + 1
171+
else f[i][j] = Math.max(f[i - 1][j], f[i][j - 1])
172+
}
173+
}
174+
let ans = ""
175+
let i = n, j = m
176+
while (i > 0 || j > 0) {
177+
if (i == 0) ans += s2[j--]
178+
else if (j == 0) ans += s1[i--]
179+
else {
180+
if (s1[i] == s2[j]) {
181+
ans += s1[i]
182+
i--; j--
183+
} else if (f[i][j] == f[i - 1][j]) {
184+
ans += s1[i--]
185+
} else {
186+
ans += s2[j--]
187+
}
188+
}
189+
}
190+
return ans.split('').reverse().join('')
191+
};
192+
```
158193
* 时间复杂度:`LCS` 复杂度为 $O(n \times m)$;构造答案复杂度为 $O(n \times m)$。整体复杂度为 $O(n \times m)$
159194
* 空间复杂度:$O(n \times m)$
160195

LeetCode/1251-1260/1253. 重构 2 行二进制矩阵(中等).md

+90-2
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,11 @@ Tag : 「模拟」、「贪心」、「构造」
6161

6262
若处理完 `colsum` 后,两行剩余 $1$ 个数恰好均为 $0$,说明构造出了合法方案。
6363

64-
容易证明:**不存在某个决策回合中,必须先填入剩余个数少的一方,才能顺利构造。**可用反证法进行证明,若存在某个回合必须填入剩余个数少的一方(假设该回合上填 `1` 下填 `0`),必然能够找到同为 $colsum[j] = 1$ 的回合进行交换,同时不影响合法性(上下行的总和不变,同时 $colsum[i] = colsum[j] = 1$)。
64+
容易证明:**不存在某个决策回合中,必须先填入剩余个数少的一方,才能顺利构造。**
6565

66-
代码:
66+
可用反证法进行证明,若存在某个回合必须填入剩余个数少的一方(假设该回合上填 `1` 下填 `0`),必然能够找到同为 $colsum[j] = 1$ 的回合进行交换,同时不影响合法性(上下行的总和不变,同时 $colsum[i] = colsum[j] = 1$)。
6767

68+
Java 代码:
6869
```Java
6970
class Solution {
7071
public List<List<Integer>> reconstructMatrix(int upper, int lower, int[] colsum) {
@@ -95,6 +96,93 @@ class Solution {
9596
}
9697
}
9798
```
99+
C++ 代码:
100+
```C++
101+
class Solution {
102+
public:
103+
vector<vector<int>> reconstructMatrix(int upper, int lower, vector<int>& colsum) {
104+
int n = colsum.size();
105+
vector<vector<int>> ans;
106+
vector<int> a, b;
107+
for (int i = 0; i < n; i++) {
108+
int m = colsum[i];
109+
if (m == 0) {
110+
a.push_back(0); b.push_back(0);
111+
} else if (m == 2) {
112+
upper--; lower--;
113+
a.push_back(1); b.push_back(1);
114+
} else {
115+
if (upper >= lower) {
116+
upper--;
117+
a.push_back(1); b.push_back(0);
118+
} else {
119+
lower--;
120+
a.push_back(0); b.push_back(1);
121+
}
122+
}
123+
}
124+
if (upper == 0 && lower == 0) {
125+
ans.push_back(a); ans.push_back(b);
126+
}
127+
return ans;
128+
}
129+
};
130+
```
131+
Python 代码:
132+
```Python
133+
class Solution:
134+
def reconstructMatrix(self, upper: int, lower: int, colsum: List[int]) -> List[List[int]]:
135+
n = len(colsum)
136+
ans = []
137+
a, b = [], []
138+
for i in range(n):
139+
m = colsum[i]
140+
if m == 0:
141+
a.append(0)
142+
b.append(0)
143+
elif m == 2:
144+
upper, lower = upper - 1, lower - 1
145+
a.append(1)
146+
b.append(1)
147+
else:
148+
a.append(1 if upper >= lower else 0)
149+
b.append(0 if upper >= lower else 1)
150+
if upper >= lower: upper -= 1
151+
else: lower -= 1
152+
if upper == lower == 0:
153+
ans.append(a)
154+
ans.append(b)
155+
return ans
156+
```
157+
TypeScript 代码:
158+
```TypeScript
159+
function reconstructMatrix(upper: number, lower: number, colsum: number[]): number[][] {
160+
const n = colsum.length;
161+
let ans: number[][] = [];
162+
let a: number[] = [], b: number[] = [];
163+
for (let i = 0; i < n; i++) {
164+
const m = colsum[i];
165+
if (m === 0) {
166+
a.push(0); b.push(0);
167+
} else if (m === 2) {
168+
upper--; lower--;
169+
a.push(1); b.push(1);
170+
} else {
171+
if (upper >= lower) {
172+
upper--;
173+
a.push(1); b.push(0);
174+
} else {
175+
lower--;
176+
a.push(0); b.push(1);
177+
}
178+
}
179+
}
180+
if (upper === 0 && lower === 0) {
181+
ans.push(a); ans.push(b);
182+
}
183+
return ans;
184+
};
185+
```
98186
* 时间复杂度:$O(C \times n)$,其中 $C = 2$ 代表行数
99187
* 空间复杂度:$O(C \times n)$
100188

LeetCode/1251-1260/1260. 二维网格迁移(简单).md

+36-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ Tag : 「模拟」、「构造」
66

77

88

9-
给你一个 `m``n` 列的二维网格 `grid` 和一个整数 `k`。你需要将 `grid` 迁移 `k` 次。
9+
给你一个 `m``n` 列的二维网格 `grid` 和一个整数 `k`
10+
11+
你需要将 `grid` 迁移 `k` 次。
1012

1113
每次「迁移」操作将会引发下述活动:
1214

@@ -75,6 +77,39 @@ class Solution {
7577
}
7678
}
7779
```
80+
C++ 代码:
81+
```C++
82+
class Solution {
83+
public:
84+
vector<vector<int>> shiftGrid(vector<vector<int>>& g, int k) {
85+
int n = g.size(), m = g[0].size();
86+
vector<vector<int>> mat(n, vector<int>(m));
87+
for(int i = 0; i < m; ++i) {
88+
int tcol = (i + k) % m, trow = ((i + k) / m) % n, idx = 0;
89+
while(idx != n) {
90+
mat[trow++][tcol] = g[idx++][i];
91+
if(trow == n) trow = 0;
92+
}
93+
}
94+
return mat;
95+
}
96+
};
97+
```
98+
Python 代码:
99+
```Python
100+
class Solution:
101+
def shiftGrid(self, g: List[List[int]], k: int) -> List[List[int]]:
102+
n, m = len(g), len(g[0])
103+
mat = [[0]*m for _ in range(n)]
104+
for i in range(m):
105+
tcol = (i + k) % m
106+
trow = ((i + k) // m) % n
107+
idx = 0
108+
while idx != n:
109+
mat[trow][tcol] = g[idx][i]
110+
trow, idx = (trow + 1) % n, idx + 1
111+
return mat
112+
```
78113
TypeScript 代码:
79114
```TypeScript
80115
function shiftGrid(g: number[][], k: number): number[][] {

LeetCode/1401-1410/1408. 数组中的字符串匹配(简单).md

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ Tag : 「模拟」
66

77

88

9-
给你一个字符串数组 `words`,数组中的每个字符串都可以看作是一个单词。请你按 任意 顺序返回 `words` 中是其他单词的子字符串的所有单词。
9+
给你一个字符串数组 `words`,数组中的每个字符串都可以看作是一个单词。
10+
11+
请你按任意顺序返回 `words` 中是其他单词的子字符串的所有单词。
1012

1113
如果你可以删除 `words[j]` 最左侧和/或最右侧的若干字符得到 `word[i]`,那么字符串 `words[i]` 就是 `words[j]` 的一个子字符串。
1214

LeetCode/1471-1480/1473. 粉刷房子 III(困难).md

+11-7
Original file line numberDiff line numberDiff line change
@@ -83,16 +83,20 @@ Tag : 「动态规划」、「序列 DP」
8383
同时根据「第 $i$ 间房子的颜色 $j$」与「第 $i - 1$ 间房子的颜色 $p$」是否相同,会决定第 $i$ 间房子是否形成一个新的分区。这同样需要进行分情况讨论。
8484
整理后的转移方程为:
8585

86-
$$ f[i][j][k]=\begin{cases}
86+
$$
87+
f[i][j][k]=\begin{cases}
8788
min(f[i - 1][j][k], f[i - 1][p][k - 1]) &j == houses[i], p != j\\
8889
INF & j != houses[i]
89-
\end{cases}$$
90+
\end{cases}
91+
$$
9092

9193
* 第 $i$ 间房子尚未被上色,即 $houses[i] == 0$,此时房子可以被粉刷成任意颜色。不会有无效状态的情况。
9294
同样,根据「第 $i$ 间房子的颜色 $j$」与「第 $i - 1$ 间房子的颜色 $p$」是否相同,会决定第 $i$ 间房子是否形成一个新的分区。
9395
转移方程为:
9496

95-
$$ f[i][j][k] = min(f[i - 1][j][k], f[i - 1][p][k - 1]) + cost[i][j - 1], p != j $$
97+
$$
98+
f[i][j][k] = min(f[i - 1][j][k], f[i - 1][p][k - 1]) + cost[i][j - 1], p != j
99+
$$
96100

97101
一些编码细节:
98102

@@ -167,8 +171,8 @@ class Solution {
167171
}
168172
}
169173
```
170-
* 时间复杂度:共有 $m * n * t$ 个状态需要被转移,每次转移需要枚举「所依赖的状态」的颜色,复杂度为 $O(n)$。整体复杂度为 $O(m * n^2 * t)$
171-
* 空间复杂度:$O(m * n * t)$
174+
* 时间复杂度:共有 $m \times n \times t$ 个状态需要被转移,每次转移需要枚举「所依赖的状态」的颜色,复杂度为 $O(n)$。整体复杂度为 $O(m \times n^2 \times t)$
175+
* 空间复杂度:$O(m \times n \times t)$
172176

173177
---
174178

@@ -280,8 +284,8 @@ class Solution {
280284
}
281285
}
282286
```
283-
* 时间复杂度:共有 $m * n * t$ 个状态需要被转移,每次转移需要枚举「所依赖的状态」的颜色,复杂度为 $O(n)$。整体复杂度为 $O(m * n^2 * t)$
284-
* 空间复杂度:$O(m * n * t)$
287+
* 时间复杂度:共有 $m \times n \times t$ 个状态需要被转移,每次转移需要枚举「所依赖的状态」的颜色,复杂度为 $O(n)$。整体复杂度为 $O(m \times n^2 \times t)$
288+
* 空间复杂度:$O(m \times n \times t)$
285289

286290
---
287291

0 commit comments

Comments
 (0)