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] main from itcharge:main #13

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 8 commits into AlgorithmAndLeetCode:main from itcharge:main
Jul 18, 2022
Merged
Changes from 1 commit
Commits
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 0674. 最长连续递增序列.md
  • Loading branch information
杨世超 committed Jul 18, 2022
commit 8bcaf8944d17fb43b48de454852edb73bdb2f058
72 changes: 57 additions & 15 deletions Solutions/0674. 最长连续递增序列.md
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,71 @@

## 题目大意

给定一个未经排序的数组 `nums`。要求:找到最长且连续递增的子序列,并返回该序列的长度。
**描述**:给定一个未经排序的数组 `nums`。

**要求**:找到最长且连续递增的子序列,并返回该序列的长度。

**说明**:

- **连续递增的子序列**:可以由两个下标 `l` 和 `r`(`l < r`)确定,如果对于每个 `l <= i < r`,都有 `nums[i] < nums[i + 1] `,那么子序列 `[nums[l], nums[l + 1], ..., nums[r - 1], nums[r]]` 就是连续递增子序列。
- 1ドル \le nums.length \le 10^4$。
- $-10^9 \le nums[i] \le 10^9$。

**示例**:

```Python
输入 nums = [1,3,5,4,7]
输出 3
解释 最长连续递增序列是 [1,3,5], 长度为 3。尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。
```

## 解题思路

因为要求了连续,所以只需要比较相邻的元素大小。我们使用变量 `count` 计算当前子序列的递增长度,使用 `res` 记录最长连续递增子序列长度。然后递推求解即可。
### 思路 1:动态规划

##### 1. 定义状态

定义状态 `dp[i]` 表示为:以 `nums[i]` 结尾的最长且连续递增的子序列长度。

##### 2. 状态转移方程

因为求解的是连续子序列,所以只需要考察相邻元素的状态转移方程。

如果一个较小的数右侧相邻元素为一个较大的数,则会形成一个更长的递增子序列。

## 代码
对于相邻的数组元素 `nums[i - 1]` 和 `nums[i]` 来说:

- 如果 `nums[i - 1] < nums[i]`,则 `nums[i]` 可以接在 `nums[i - 1]` 后面,此时以 `nums[i]` 结尾的最长递增子序列长度会在「以 `nums[i - 1]` 结尾的最长递增子序列长度」的基础上加 `1`,即 `dp[i] = dp[i - 1] + 1`。

- 如果 `nums[i - 1] >= nums[i]`,则 `nums[i]` 不可以接在 `nums[i - 1]` 后面,可以直接跳过。

综上,我们的状态转移方程为:`dp[i] = dp[i - 1] + 1`,`nums[i - 1] < nums[i]`。

##### 3. 初始化

默认状态下,把数组中的每个元素都作为长度为 `1` 的最长且连续递增的子序列长度。即 `dp[i] = 1`。

##### 4. 最终结果

根据我们之前定义的状态,`dp[i]` 表示为:以 `nums[i]` 结尾的最长且连续递增的子序列长度。则为了计算出最大值,则需要再遍历一遍 `dp` 数组,求出最大值即为最终结果。

### 思路 1:动态规划代码

```Python
class Solution:
def findLengthOfLCIS(self, nums: List[int]) -> int:
size = len(nums)
if size == 0:
return 0
res = 1
count = 1
for i in range(size - 1):
if nums[i + 1] > nums[i]:
count += 1
else:
count = 1
if count > res:
res = count
return res
dp = [1 for _ in range(size)]

for i in range(1, size):
if nums[i - 1] < nums[i]:
dp[i] = dp[i - 1] + 1

return max(dp)
```

### 思路 1 :复杂度分析

- **时间复杂度**:$O(n)$。一重循环遍历的时间复杂度为 $O(n),ドル最后求最大值的时间复杂度是 $O(n),ドル所以总体时间复杂度为 $O(n)$。
- **空间复杂度**:$O(n)$。用到了一维数组保存状态,所以总体空间复杂度为 $O(n)$。

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