Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 53402bd

Browse files
✨feat: add 1092、1253、1260、1408、1473、1640、1743、1759、1802、236、481、543、636、687、764、769、777、790、791、805、808、864、895
1 parent 1c3b609 commit 53402bd

27 files changed

+1766
-322
lines changed

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

Lines changed: 61 additions & 26 deletions
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‎

Lines changed: 90 additions & 2 deletions
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‎

Lines changed: 36 additions & 1 deletion
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‎

Lines changed: 3 additions & 1 deletion
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‎

Lines changed: 11 additions & 7 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /