Skip to content

Commit 5ecb270

Browse files
committedNov 21, 2021
Merge branch 'master' of github.com:youngyangyang04/leetcode-master
2 parents 39fbb59 + efa673e commit 5ecb270

19 files changed

+501
-9
lines changed
 

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

+27
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,32 @@ public:
263263
## Java
264264

265265
```java
266+
// 双指针 中心扩散法
267+
class Solution {
268+
public String longestPalindrome(String s) {
269+
String s1 = "";
270+
String s2 = "";
271+
String res = "";
272+
for (int i = 0; i < s.length(); i++) {
273+
// 分两种情况:即一个元素作为中心点,两个元素作为中心点
274+
s1 = extend(s, i, i); // 情况1
275+
res = s1.length() > res.length() ? s1 : res;
276+
s2 = extend(s, i, i + 1); // 情况2
277+
res = s2.length() > res.length() ? s2 : res;
278+
}
279+
return res; // 返回最长的
280+
}
281+
public String extend(String s, int start, int end){
282+
String tmp = "";
283+
while (start >= 0 && end < s.length() && s.charAt(start) == s.charAt(end)){
284+
tmp = s.substring(start, end + 1); // Java中substring是左闭右开的,所以要+1
285+
// 向两边扩散
286+
start--;
287+
end++;
288+
}
289+
return tmp;
290+
}
291+
}
266292
```
267293

268294
## Python
@@ -317,6 +343,7 @@ class Solution:
317343
## Go
318344
319345
```go
346+
320347
```
321348

322349
## JavaScript

‎problems/0028.实现strStr.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ next数组就是一个前缀表(prefix table)。
118118

119119
此时就要问了**前缀表是如何记录的呢?**
120120

121-
首先要知道前缀表的任务是当前位置匹配失败,找到之前已经匹配上的位置,在重新匹配,此也意味着在某个字符失配时,前缀表会告诉你下一步匹配中,模式串应该跳到哪个位置。
121+
首先要知道前缀表的任务是当前位置匹配失败,找到之前已经匹配上的位置,再重新匹配,此也意味着在某个字符失配时,前缀表会告诉你下一步匹配中,模式串应该跳到哪个位置。
122122

123123
那么什么是前缀表:**记录下标i之前(包括i)的字符串中,有多大长度的相同前缀后缀。**
124124

@@ -146,7 +146,7 @@ next数组就是一个前缀表(prefix table)。
146146

147147
# 为什么一定要用前缀表
148148

149-
这就是前缀表那为啥就能告诉我们 上次匹配的位置,并跳过去呢?
149+
这就是前缀表,那为啥就能告诉我们 上次匹配的位置,并跳过去呢?
150150

151151
回顾一下,刚刚匹配的过程在下标5的地方遇到不匹配,模式串是指向f,如图:
152152
<img src='https://code-thinking.cdn.bcebos.com/pics/KMP%E7%B2%BE%E8%AE%B21.png' width=600 alt='KMP精讲1'> </img></div>

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

+23
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,29 @@ class Solution:
163163
low += 1
164164
high -= 1
165165
```
166+
>上一版本简化版
167+
'''python
168+
class Solution(object):
169+
def nextPermutation(self, nums: List[int]) -> None:
170+
n = len(nums)
171+
i = n-2
172+
while i >= 0 and nums[i] >= nums[i+1]:
173+
i -= 1
174+
175+
if i > -1: // i==-1,不存在下一个更大的排列
176+
j = n-1
177+
while j >= 0 and nums[j] <= nums[i]:
178+
j -= 1
179+
nums[i], nums[j] = nums[j], nums[i]
180+
181+
start, end = i+1, n-1
182+
while start < end:
183+
nums[start], nums[end] = nums[end], nums[start]
184+
start += 1
185+
end -= 1
186+
187+
return nums
188+
'''
166189

167190
## Go
168191

‎problems/0042.接雨水.md

+41
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,48 @@ func trap(height []int) int {
602602
}
603603
```
604604

605+
动态规划解法:
606+
607+
```go
608+
func trap(height []int) int {
609+
sum:=0
610+
n:=len(height)
611+
lh:=make([]int,n)
612+
rh:=make([]int,n)
613+
lh[0]=height[0]
614+
rh[n-1]=height[n-1]
615+
for i:=1;i<n;i++{
616+
lh[i]=max(lh[i-1],height[i])
617+
}
618+
for i:=n-2;i>=0;i--{
619+
rh[i]=max(rh[i+1],height[i])
620+
}
621+
for i:=1;i<n-1;i++{
622+
h:=min(rh[i],lh[i])-height[i]
623+
if h>0{
624+
sum+=h
625+
}
626+
}
627+
return sum
628+
}
629+
func max(a,b int)int{
630+
if a>b{
631+
return a
632+
}
633+
return b
634+
}
635+
func min(a,b int)int{
636+
if a<b{
637+
return a
638+
}
639+
return b
640+
}
641+
```
642+
643+
644+
605645
JavaScript:
646+
606647
```javascript
607648
//双指针
608649
var trap = function(height) {

‎problems/0047.全排列II.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939

4040
那么排列问题其实也是一样的套路。
4141

42-
**还要强调的是去重一定要对元素经行排序,这样我们才方便通过相邻的节点来判断是否重复使用了**
42+
**还要强调的是去重一定要对元素进行排序,这样我们才方便通过相邻的节点来判断是否重复使用了**
4343

4444
我以示例中的 [1,1,2]为例 (为了方便举例,已经排序)抽象为一棵树,去重过程如图:
4545

‎problems/0104.二叉树的最大深度.md

+55
Original file line numberDiff line numberDiff line change
@@ -598,5 +598,60 @@ var maxDepth = function(root) {
598598
};
599599
```
600600

601+
## C
602+
二叉树最大深度递归
603+
```c
604+
int maxDepth(struct TreeNode* root){
605+
//若传入结点为NULL,返回0
606+
if(!root)
607+
return 0;
608+
609+
//求出左子树深度
610+
int left = maxDepth(root->left);
611+
//求出右子树深度
612+
int right = maxDepth(root->right);
613+
//求出左子树深度和右子树深度的较大值
614+
int max = left > right ? left : right;
615+
//返回较大值+1(1为当前层数)
616+
return max + 1;
617+
}
618+
```
619+
二叉树最大深度迭代
620+
```c
621+
int maxDepth(struct TreeNode* root){
622+
//若传入根节点为NULL,返回0
623+
if(!root)
624+
return 0;
625+
626+
int depth = 0;
627+
//开辟队列空间
628+
struct TreeNode** queue = (struct TreeNode**)malloc(sizeof(struct TreeNode*) * 6000);
629+
int queueFront = 0;
630+
int queueEnd = 0;
631+
632+
//将根结点入队
633+
queue[queueEnd++] = root;
634+
635+
int queueSize;
636+
//求出当前队列中元素个数
637+
while(queueSize = queueEnd - queueFront) {
638+
int i;
639+
//若当前队列中结点有左右子树,则将它们的左右子树入队
640+
for(i = 0; i < queueSize; i++) {
641+
struct TreeNode* tempNode = queue[queueFront + i];
642+
if(tempNode->left)
643+
queue[queueEnd++] = tempNode->left;
644+
if(tempNode->right)
645+
queue[queueEnd++] = tempNode->right;
646+
}
647+
//更新队头下标
648+
queueFront += queueSize;
649+
//深度+1
650+
depth++;
651+
}
652+
return depth;
653+
}
654+
```
655+
601656
-----------------------
602657
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

‎problems/0122.买卖股票的最佳时机II(动态规划).md

+27
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,33 @@ class Solution:
197197
```
198198

199199
Go:
200+
```go
201+
// 买卖股票的最佳时机Ⅱ 动态规划
202+
// 时间复杂度O(n) 空间复杂度O(n)
203+
func maxProfit(prices []int) int {
204+
dp := make([][]int, len(prices))
205+
status := make([]int, len(prices) * 2)
206+
for i := range dp {
207+
dp[i] = status[:2]
208+
status = status[2:]
209+
}
210+
dp[0][0] = -prices[0]
211+
212+
for i := 1; i < len(prices); i++ {
213+
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i])
214+
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i])
215+
}
216+
217+
return dp[len(prices) - 1][1]
218+
}
219+
220+
func max(a, b int) int {
221+
if a > b {
222+
return a
223+
}
224+
return b
225+
}
226+
```
200227

201228
```go
202229
func maxProfit(prices []int) int {

‎problems/0123.买卖股票的最佳时机III.md

+31
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,38 @@ const maxProfit = prices => {
347347
};
348348
```
349349

350+
Go:
350351

352+
> 版本一:
353+
```go
354+
// 买卖股票的最佳时机III 动态规划
355+
// 时间复杂度O(n) 空间复杂度O(n)
356+
func maxProfit(prices []int) int {
357+
dp := make([][]int, len(prices))
358+
status := make([]int, len(prices) * 4)
359+
for i := range dp {
360+
dp[i] = status[:4]
361+
status = status[4:]
362+
}
363+
dp[0][0], dp[0][2] = -prices[0], -prices[0]
364+
365+
for i := 1; i < len(prices); i++ {
366+
dp[i][0] = max(dp[i - 1][0], -prices[i])
367+
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i])
368+
dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] - prices[i])
369+
dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] + prices[i])
370+
}
371+
372+
return dp[len(prices) - 1][3]
373+
}
374+
375+
func max(a, b int) int {
376+
if a > b {
377+
return a
378+
}
379+
return b
380+
}
381+
```
351382

352383

353384
-----------------------

‎problems/0188.买卖股票的最佳时机IV.md

+35
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,41 @@ class Solution:
273273
return dp[2*k]
274274
```
275275
Go:
276+
版本一:
277+
```go
278+
// 买卖股票的最佳时机IV 动态规划
279+
// 时间复杂度O(kn) 空间复杂度O(kn)
280+
func maxProfit(k int, prices []int) int {
281+
if k == 0 || len(prices) == 0 {
282+
return 0
283+
}
284+
285+
dp := make([][]int, len(prices))
286+
status := make([]int, (2 * k + 1) * len(prices))
287+
for i := range dp {
288+
dp[i] = status[:2 * k + 1]
289+
status = status[2 * k + 1:]
290+
}
291+
for j := 1; j < 2 * k; j += 2 {
292+
dp[0][j] = -prices[0]
293+
}
294+
295+
for i := 1; i < len(prices); i++ {
296+
for j := 0; j < 2 * k; j += 2 {
297+
dp[i][j + 1] = max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i])
298+
dp[i][j + 2] = max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i])
299+
}
300+
}
301+
return dp[len(prices) - 1][2 * k]
302+
}
303+
304+
func max(a, b int) int {
305+
if a > b {
306+
return a
307+
}
308+
return b
309+
}
310+
```
276311

277312
```go
278313
func maxProfit(k int, prices []int) int {

0 commit comments

Comments
 (0)
Please sign in to comment.