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 d1fc90f

Browse files
Merge branch 'master' into XiongGu-branch
2 parents c35a886 + 83efa79 commit d1fc90f

7 files changed

+166
-25
lines changed

‎problems/0019.删除链表的倒数第N个节点.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public ListNode removeNthFromEnd(ListNode head, int n){
110110
fastIndex = fastIndex.next;
111111
}
112112
113-
while (fastIndex.next != null){
113+
while (fastIndex != null){
114114
fastIndex = fastIndex.next;
115115
slowIndex = slowIndex.next;
116116
}

‎problems/0053.最大子序和(动态规划).md‎

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -226,18 +226,20 @@ object Solution {
226226

227227
```typescript
228228
function maxSubArray(nums: number[]): number {
229-
/**
230-
dp[i]:以nums[i]结尾的最大和
231-
*/
232-
const dp: number[] = []
233-
dp[0] = nums[0];
234-
let resMax: number = 0;
235-
for (let i = 1; i < nums.length; i++) {
236-
dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
237-
resMax = Math.max(resMax, dp[i]);
229+
const len = nums.length
230+
if (len === 1) return nums[0]
231+
232+
const dp: number[] = new Array(len)
233+
let resMax: number = dp[0] = nums[0]
234+
235+
for (let i = 1; i < len; i++) {
236+
dp[i] = Math.max(dp[i - 1] + nums[i], nums[i])
237+
// 注意值为负数的情况
238+
if (dp[i] > resMax) resMax = dp[i]
238239
}
239-
return resMax;
240-
};
240+
241+
return resMax
242+
}
241243
```
242244

243245

‎problems/0098.验证二叉搜索树.md‎

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,43 @@ var isValidBST = function (root) {
595595
};
596596
```
597597

598+
> 迭代法:
599+
600+
```JavaScript
601+
/**
602+
* Definition for a binary tree node.
603+
* function TreeNode(val, left, right) {
604+
* this.val = (val===undefined ? 0 : val)
605+
* this.left = (left===undefined ? null : left)
606+
* this.right = (right===undefined ? null : right)
607+
* }
608+
*/
609+
/**
610+
* @param {TreeNode} root
611+
* @return {boolean}
612+
*/
613+
let pre = null;
614+
var isValidBST = function (root) {
615+
const queue = [];
616+
let cur = root;
617+
let pre = null;
618+
while (cur !== null || queue.length !== 0) {
619+
if (cur !== null) {
620+
queue.push(cur);
621+
cur = cur.left;
622+
} else {
623+
cur = queue.pop();
624+
if (pre !== null && cur.val <= pre.val) {
625+
return false;
626+
}
627+
pre = cur;
628+
cur = cur.right;
629+
}
630+
}
631+
return true;
632+
};
633+
```
634+
598635
### TypeScript
599636

600637
> 辅助数组解决:
@@ -637,6 +674,30 @@ function isValidBST(root: TreeNode | null): boolean {
637674
};
638675
```
639676

677+
> 迭代法:
678+
679+
```TypeScript
680+
function isValidBST(root: TreeNode | null): boolean {
681+
const queue: TreeNode[] = [];
682+
let cur: TreeNode | null = root;
683+
let pre: TreeNode | null = null;
684+
while (cur !== null || queue.length !== 0) {
685+
if (cur !== null) {
686+
queue.push(cur);
687+
cur = cur.left;
688+
} else {
689+
cur = queue.pop()!;
690+
if (pre !== null && cur!.val <= pre.val) {
691+
return false;
692+
}
693+
pre = cur;
694+
cur = cur!.right;
695+
}
696+
}
697+
return true;
698+
}
699+
```
700+
640701
### Scala
641702

642703
辅助数组解决:

‎problems/0239.滑动窗口最大值.md‎

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@ public:
6262
6363
每次窗口移动的时候,调用que.pop(滑动窗口中移除元素的数值),que.push(滑动窗口添加元素的数值),然后que.front()就返回我们要的最大值。
6464
65-
这么个队列香不香,要是有现成的这种数据结构是不是更香了!
65+
这么个队列香不香,要是有现成的这种数据结构是不是更香了!
6666
67-
**可惜了,没有! 我们需要自己实现这么个队列。**
67+
其实在C++中,可以使用 multiset 来模拟这个过程,文末提供这个解法仅针对C++,以下讲解我们还是靠自己来实现这个单调队列。
6868
6969
然后再分析一下,队列里的元素一定是要排序的,而且要最大值放在出队口,要不然怎么知道最大值呢。
7070
@@ -839,6 +839,28 @@ impl Solution {
839839
}
840840
```
841841

842+
### C++
843+
使用multiset作为单调队列
844+
845+
多重集合(`multiset`) 用以有序地存储元素的容器。允许存在相等的元素。
846+
847+
在遍历原数组的时候,只需要把窗口的头元素加入到multiset中,然后把窗口的尾元素删除即可。因为multiset是有序的,并且提供了*rbegin(),可以直接获取窗口最大值。
848+
```cpp
849+
class Solution {
850+
public:
851+
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
852+
multiset<int> st;
853+
vector<int> ans;
854+
for (int i = 0; i < nums.size(); i++) {
855+
if (i >= k) st.erase(st.find(nums[i - k]));
856+
st.insert(nums[i]);
857+
if (i >= k - 1) ans.push_back(*st.rbegin());
858+
}
859+
return ans;
860+
}
861+
};
862+
```
863+
842864
<p align="center">
843865
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
844866
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>

‎problems/0392.判断子序列.md‎

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -216,26 +216,51 @@ const isSubsequence = (s, t) => {
216216

217217
### TypeScript:
218218

219+
> 二维数组
220+
219221
```typescript
220222
function isSubsequence(s: string, t: string): boolean {
221223
/**
222224
dp[i][j]: s的前i-1个,t的前j-1个,最长公共子序列的长度
223225
*/
224-
const sLen:number= s.length,
225-
tLen:number= t.length;
226-
const dp: number[][] = new Array(sLen + 1).fill(0)
227-
.map(_=>newArray(tLen+1).fill(0));
226+
const sLen= s.length
227+
consttLen= t.length
228+
const dp: number[][] = new Array(sLen + 1).fill(0).map(_=>newArray(tLen+1).fill(0))
229+
228230
for (let i = 1; i <= sLen; i++) {
229231
for (let j = 1; j <= tLen; j++) {
230-
if (s[i - 1] === t[j - 1]) {
231-
dp[i][j] = dp[i - 1][j - 1] + 1;
232-
} else {
233-
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
234-
}
232+
if (s[i - 1] === t[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1
233+
// 只需要取 j-2 的 dp 值即可,不用考虑 i-2
234+
else dp[i][j] = dp[i][j - 1]
235235
}
236236
}
237-
return dp[sLen][tLen] === s.length;
238-
};
237+
return dp[sLen][tLen] === s.length
238+
}
239+
```
240+
241+
> 滚动数组
242+
```typescript
243+
function isSubsequence(s: string, t: string): boolean {
244+
const sLen = s.length
245+
const tLen = t.length
246+
const dp: number[] = new Array(tLen + 1).fill(0)
247+
248+
for (let i = 1; i <= sLen; i++) {
249+
let prev: number = 0;
250+
let temp: number = 0;
251+
for (let j = 1; j <= tLen; j++) {
252+
// 备份一下当前状态(经过上层迭代后的)
253+
temp = dp[j]
254+
// prev 相当于 dp[j-1](累加了上层的状态)
255+
// 如果单纯 dp[j-1] 则不会包含上层状态
256+
if (s[i - 1] === t[j - 1]) dp[j] = prev + 1
257+
else dp[j] = dp[j - 1]
258+
// 继续使用上一层状态更新参数用于当前层下一个状态
259+
prev = temp
260+
}
261+
}
262+
return dp[tLen] === sLen
263+
}
239264
```
240265

241266
### Go:

‎problems/0827.最大人工岛.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@ class Solution:
345345
res = max(res, count)
346346
return res
347347

348+
348349
```
349350

350351
<p align="center">

‎problems/1035.不相交的线.md‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,8 @@ const maxUncrossedLines = (nums1, nums2) => {
221221

222222
### TypeScript:
223223

224+
> 二维数组
225+
224226
```typescript
225227
function maxUncrossedLines(nums1: number[], nums2: number[]): number {
226228
/**
@@ -243,6 +245,34 @@ function maxUncrossedLines(nums1: number[], nums2: number[]): number {
243245
};
244246
```
245247

248+
> 滚动数组
249+
```typescript
250+
function maxUncrossedLines(nums1: number[], nums2: number[]): number {
251+
const len1 = nums1.length
252+
const len2 = nums2.length
253+
254+
const dp: number[] = new Array(len2 + 1).fill(0)
255+
256+
for (let i = 1; i <= len1; i++) {
257+
let prev: number = 0;
258+
let temp: number = 0;
259+
for (let j = 1; j <= len2; j++) {
260+
// 备份一下当前状态(经过上层迭代后的)
261+
temp = dp[j]
262+
// prev 相当于 dp[j-1](累加了上层的状态)
263+
// 如果单纯 dp[j-1] 则不会包含上层状态
264+
if (nums1[i - 1] === nums2[j - 1]) dp[j] = prev + 1
265+
// dp[j] 表示之前的 dp[i][j-1],dp[j-1] 表示 dp[i-1][j]
266+
else dp[j] = Math.max(dp[j], dp[j - 1])
267+
// 继续使用上一层状态更新参数用于当前层下一个状态
268+
prev = temp
269+
}
270+
}
271+
return dp[len2]
272+
}
273+
```
274+
275+
246276
<p align="center">
247277
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
248278
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>

0 commit comments

Comments
(0)

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