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

[pull] master from youngyangyang04:master #275

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
pull merged 24 commits into AlgorithmAndLeetCode:master from youngyangyang04:master
May 29, 2023
Merged
Changes from 1 commit
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
2f86a5c
Update 0701.二叉搜索树中的插入操作.md
jianghongcheng May 25, 2023
343e077
Update 0216.组合总和III.md
jianghongcheng May 26, 2023
89e9d75
Update 0077.组合.md
jianghongcheng May 26, 2023
4d48c45
Update 0077.组合优化.md
jianghongcheng May 26, 2023
847c60a
Update 0017.电话号码的字母组合.md
jianghongcheng May 26, 2023
2c51420
Update 0039.组合总和.md
jianghongcheng May 26, 2023
20db57f
Update 0040.组合总和II.md
jianghongcheng May 26, 2023
59742e5
Update 0040.组合总和II.md
jianghongcheng May 26, 2023
4586386
Update 0131.分割回文串.md
jianghongcheng May 27, 2023
78445d7
Update 0131.分割回文串.md
jianghongcheng May 27, 2023
51c8976
Update 0093.复原IP地址.md
jianghongcheng May 27, 2023
d45c141
Update 0078.子集.md
jianghongcheng May 27, 2023
5801ae7
Update 0090.子集II.md
jianghongcheng May 27, 2023
eb72f26
Update 0491.递增子序列.md
jianghongcheng May 28, 2023
7e3fc8e
Update 0491.递增子序列.md
jianghongcheng May 28, 2023
a6c95b7
Update 0491.递增子序列.md
jianghongcheng May 28, 2023
b033a08
Update 0046.全排列.md
jianghongcheng May 28, 2023
fd2608a
Update 0047.全排列II.md
jianghongcheng May 28, 2023
19ecde0
Update 回溯算法去重问题的另一种写法.md
jianghongcheng May 28, 2023
498395d
Update 0332.重新安排行程.md
jianghongcheng May 28, 2023
93e0a18
Update 0051.N皇后.md
jianghongcheng May 28, 2023
11581df
Update 0455.分发饼干.md
jianghongcheng May 28, 2023
18a406e
Update 0376.摆动序列.md
jianghongcheng May 28, 2023
996ddbe
Merge pull request #2098 from jianghongcheng/master
youngyangyang04 May 29, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Update 0376.摆动序列.md
  • Loading branch information
jianghongcheng authored May 28, 2023
commit 18a406e14fd4f5a0d4b5c1a1e3f37410ff5e3fce
87 changes: 64 additions & 23 deletions problems/0376.摆动序列.md
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -305,21 +305,43 @@ class Solution {

### Python

**贪心**
贪心(版本一)

```python
class Solution:
def wiggleMaxLength(self, nums):
if len(nums) <= 1:
return len(nums) # 如果数组长度为0或1,则返回数组长度
curDiff = 0 # 当前一对元素的差值
preDiff = 0 # 前一对元素的差值
result = 1 # 记录峰值的个数,初始为1(默认最右边的元素被视为峰值)
for i in range(len(nums) - 1):
curDiff = nums[i + 1] - nums[i] # 计算下一个元素与当前元素的差值
# 如果遇到一个峰值
if (preDiff <= 0 and curDiff > 0) or (preDiff >= 0 and curDiff < 0):
result += 1 # 峰值个数加1
preDiff = curDiff # 注意这里,只在摆动变化的时候更新preDiff
return result # 返回最长摆动子序列的长度

```
贪心(版本二)

```python
class Solution:
def wiggleMaxLength(self, nums: List[int]) -> int:
preC,curC,res = 0,0,1 #题目里nums长度大于等于1,当长度为1时,其实到不了for循环里去,所以不用考虑nums长度
if len(nums) <= 1:
return len(nums) # 如果数组长度为0或1,则返回数组长度
preDiff,curDiff ,result = 0,0,1 #题目里nums长度大于等于1,当长度为1时,其实到不了for循环里去,所以不用考虑nums长度
for i in range(len(nums) - 1):
curC = nums[i + 1] - nums[i]
if curC * preC <= 0 and curC !=0: #差值为0时,不算摆动
res += 1
preC = curC #如果当前差值和上一个差值为一正一负时,才需要用当前差值替代上一个差值
return res
curDiff = nums[i + 1] - nums[i]
if curDiff * preDiff <= 0 and curDiff !=0: #差值为0时,不算摆动
result += 1
preDiff = curDiff #如果当前差值和上一个差值为一正一负时,才需要用当前差值替代上一个差值
return result

```

**动态规划**
动态规划(版本一)

```python
class Solution:
Expand All @@ -341,25 +363,44 @@ class Solution:
return max(dp[-1][0], dp[-1][1])
```

动态规划(版本二)

```python
class Solution:
def wiggleMaxLength(self, nums: List[int]) -> int:
# up i作为波峰最长的序列长度
# down i作为波谷最长的序列长度
n = len(nums)
# 长度为0和1的直接返回长度
if n<2: return n
for i in range(1,n):
if nums[i]>nums[i-1]:
# nums[i] 为波峰,1. 前面是波峰,up值不变,2. 前面是波谷,down值加1
# 目前up值取两者的较大值(其实down+1即可,可以推理前一步down和up最多相差1,所以down+1>=up)
up = max(up, down+1)
elif nums[i]<nums[i-1]:
# nums[i] 为波谷,1. 前面是波峰,up+1,2. 前面是波谷,down不变,取较大值
down = max(down, up+1)
return max(up, down)
def wiggleMaxLength(self, nums):
dp = [[0, 0] for _ in range(len(nums))] # 创建二维dp数组,用于记录摆动序列的最大长度
dp[0][0] = dp[0][1] = 1 # 初始条件,序列中的第一个元素默认为峰值,最小长度为1
for i in range(1, len(nums)):
dp[i][0] = dp[i][1] = 1 # 初始化当前位置的dp值为1
for j in range(i):
if nums[j] > nums[i]:
dp[i][1] = max(dp[i][1], dp[j][0] + 1) # 如果前一个数比当前数大,可以形成一个上升峰值,更新dp[i][1]
for j in range(i):
if nums[j] < nums[i]:
dp[i][0] = max(dp[i][0], dp[j][1] + 1) # 如果前一个数比当前数小,可以形成一个下降峰值,更新dp[i][0]
return max(dp[-1][0], dp[-1][1]) # 返回最大的摆动序列长度

```

动态规划(版本三)优化

```python
class Solution:
def wiggleMaxLength(self, nums):
if len(nums) <= 1:
return len(nums) # 如果数组长度为0或1,则返回数组长度

up = down = 1 # 记录上升和下降摆动序列的最大长度
for i in range(1, len(nums)):
if nums[i] > nums[i-1]:
up = down + 1 # 如果当前数比前一个数大,则可以形成一个上升峰值
elif nums[i] < nums[i-1]:
down = up + 1 # 如果当前数比前一个数小,则可以形成一个下降峰值

return max(up, down) # 返回上升和下降摆动序列的最大长度


```
### Go

**贪心**
Expand Down

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