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 4f632c8

Browse files
Merge pull request youngyangyang04#2211 from jinbudaily/master
更新 单调栈章节和额外题目 排版格式修复
2 parents 4037eb6 + e7c1224 commit 4f632c8

31 files changed

+370
-238
lines changed

‎problems/0005.最长回文子串.md‎

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,17 @@
3030
* 输出:"a"
3131

3232

33-
# 思路
33+
## 思路
3434

3535
本题和[647.回文子串](https://programmercarl.com/0647.回文子串.html) 差不多是一样的,但647.回文子串更基本一点,建议可以先做647.回文子串
3636

37-
## 暴力解法
37+
### 暴力解法
3838

3939
两层for循环,遍历区间起始位置和终止位置,然后判断这个区间是不是回文。
4040

4141
时间复杂度:O(n^3)
4242

43-
## 动态规划
43+
### 动态规划
4444

4545
动规五部曲:
4646

@@ -208,7 +208,7 @@ public:
208208
* 时间复杂度:O(n^2)
209209
* 空间复杂度:O(n^2)
210210
211-
## 双指针
211+
### 双指针
212212
213213
动态规划的空间复杂度是偏高的,我们再看一下双指针法。
214214
@@ -258,9 +258,9 @@ public:
258258

259259

260260

261-
# 其他语言版本
261+
## 其他语言版本
262262

263-
Java:
263+
### Java:
264264

265265
```java
266266
// 双指针 动态规划
@@ -327,7 +327,7 @@ class Solution {
327327
}
328328
```
329329

330-
Python:
330+
### Python:
331331

332332
```python
333333
class Solution:
@@ -377,7 +377,7 @@ class Solution:
377377
return s[start:end]
378378

379379
```
380-
Go:
380+
### Go:
381381

382382
```go
383383
func longestPalindrome(s string) string {
@@ -411,7 +411,7 @@ func longestPalindrome(s string) string {
411411

412412
```
413413

414-
JavaScript:
414+
### JavaScript:
415415

416416
```js
417417
//动态规划解法
@@ -527,7 +527,7 @@ var longestPalindrome = function(s) {
527527
};
528528
```
529529

530-
C:
530+
### C:
531531

532532
动态规划:
533533
```c
@@ -615,7 +615,7 @@ char * longestPalindrome(char * s){
615615
}
616616
```
617617

618-
C#:
618+
### C#:
619619

620620
動態規則:
621621
```c#
@@ -681,3 +681,4 @@ public class Solution {
681681
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
682682
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
683683
</a>
684+

‎problems/0031.下一个排列.md‎

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
* 输出:[1]
3535

3636

37-
# 思路
37+
## 思路
3838

3939
一些同学可能手动写排列的顺序,都没有写对,那么写程序的话思路一定是有问题的了,我这里以1234为例子,把全排列都列出来。可以参考一下规律所在:
4040

@@ -92,9 +92,9 @@ public:
9292
};
9393
```
9494
95-
# 其他语言版本
95+
## 其他语言版本
9696
97-
## Java
97+
### Java
9898
9999
```java
100100
class Solution {
@@ -159,7 +159,7 @@ class Solution {
159159
}
160160
```
161161
162-
## Python
162+
### Python
163163
>直接使用sorted()会开辟新的空间并返回一个新的list,故补充一个原地反转函数
164164
```python
165165
class Solution:
@@ -191,7 +191,7 @@ class Solution:
191191
"""
192192
```
193193

194-
## Go
194+
### Go
195195

196196
```go
197197
//卡尔的解法
@@ -216,7 +216,7 @@ func reverse(a []int,begin,end int){
216216
}
217217
```
218218

219-
## JavaScript
219+
### JavaScript
220220

221221
```js
222222
//卡尔的解法(吐槽一下JavaScript的sort和其他语言的不太一样,只想到了拷贝数组去排序再替换原数组来实现nums的[i + 1, nums.length)升序排序)
@@ -272,3 +272,4 @@ var nextPermutation = function(nums) {
272272
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
273273
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
274274
</a>
275+

‎problems/0042.接雨水.md‎

Lines changed: 58 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
* 输出:9
3030

3131

32-
# 思路
32+
## 思路
3333

3434
接雨水问题在面试中还是常见题目的,有必要好好讲一讲。
3535

@@ -39,7 +39,7 @@
3939
* 动态规划
4040
* 单调栈
4141

42-
## 暴力解法
42+
### 暴力解法
4343

4444
本题暴力解法也是也是使用双指针。
4545

@@ -137,7 +137,7 @@ public:
137137

138138
力扣后面修改了后台测试数据,所以以上暴力解法超时了。
139139

140-
## 双指针优化
140+
### 双指针优化
141141

142142

143143
在暴力解法中,我们可以看到只要记录左边柱子的最高高度 和 右边柱子的最高高度,就可以计算当前位置的雨水面积,这就是通过列来计算。
@@ -184,7 +184,7 @@ public:
184184
};
185185
```
186186

187-
## 单调栈解法
187+
### 单调栈解法
188188

189189
关于单调栈的理论基础,单调栈适合解决什么问题,单调栈的工作过程,大家可以先看这题讲解 [739. 每日温度](https://programmercarl.com/0739.每日温度.html)
190190

@@ -194,7 +194,7 @@ public:
194194

195195
而接雨水这道题目,我们正需要寻找一个元素,右边最大元素以及左边最大元素,来计算雨水面积。
196196

197-
### 准备工作
197+
#### 准备工作
198198

199199
那么本题使用单调栈有如下几个问题:
200200

@@ -248,7 +248,7 @@ stack<int> st; // 存着下标,计算的时候用下标对应的柱子高度
248248

249249
明确了如上几点,我们再来看处理逻辑。
250250

251-
### 单调栈处理逻辑
251+
#### 单调栈处理逻辑
252252

253253
以下操作过程其实和 [739. 每日温度](https://programmercarl.com/0739.每日温度.html) 也是一样的,建议先做 [739. 每日温度](https://programmercarl.com/0739.每日温度.html)
254254

@@ -596,7 +596,7 @@ class Solution:
596596

597597
```
598598

599-
### Go
599+
### Go:
600600

601601
```go
602602
func trap(height []int) int {
@@ -802,7 +802,7 @@ var trap = function(height) {
802802
};
803803
```
804804

805-
### TypeScript
805+
### TypeScript:
806806

807807
暴力解法:
808808

@@ -925,6 +925,55 @@ int trap(int* height, int heightSize) {
925925
* 时间复杂度 O(n)
926926
* 空间复杂度 O(1)
927927
928+
### Rust:
929+
930+
双指针
931+
932+
```rust
933+
impl Solution {
934+
pub fn trap(height: Vec<i32>) -> i32 {
935+
let n = height.len();
936+
let mut max_left = vec![0; height.len()];
937+
let mut max_right = vec![0; height.len()];
938+
max_left.iter_mut().zip(max_right.iter_mut().rev()).enumerate().fold((0, 0), |(lm, rm), (idx, (x, y))| {
939+
let lmax = lm.max(height[idx]);
940+
let rmax = rm.max(height[n - 1 - idx]);
941+
*x = lmax; *y = rmax;
942+
(lmax, rmax)
943+
});
944+
height.iter().enumerate().fold(0, |acc, (idx, x)| {
945+
let h = max_left[idx].min(max_right[idx]);
946+
if h > 0 { h - x + acc } else { acc }
947+
})
948+
}
949+
}
950+
```
951+
952+
单调栈
953+
954+
```rust
955+
impl Solution {
956+
pub fn trap(height: Vec<i32>) -> i32 {
957+
let mut stack = vec![];
958+
let mut ans = 0;
959+
for (right_pos, &right_h) in height.iter().enumerate() {
960+
while !stack.is_empty() && height[*stack.last().unwrap()] <= right_h {
961+
let mid_pos = stack.pop().unwrap();
962+
if !stack.is_empty() {
963+
let left_pos = *stack.last().unwrap();
964+
let left_h = height[left_pos];
965+
let top = std::cmp::min(left_h, right_h);
966+
if top > height[mid_pos] {
967+
ans += (top - height[mid_pos]) * (right_pos - left_pos - 1) as i32;
968+
}
969+
}
970+
}
971+
stack.push(right_pos);
972+
}
973+
ans
974+
}
975+
}
976+
```
928977

929978
Rust
930979

@@ -980,3 +1029,4 @@ impl Solution {
9801029
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
9811030
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
9821031
</a>
1032+

0 commit comments

Comments
(0)

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