Skip to content

Commit

Permalink
Update Readme.md
Browse files Browse the repository at this point in the history
  • Loading branch information
wisdompeak authored Jun 27, 2021
1 parent dd5a78a commit 5c61833
Showing 1 changed file with 11 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,21 @@

本题的难点是如何不用暴力的线性时间的算法。

#### 解法1:

根据To do or not to do的套路,对于这种“行使权力”的题目,我们很容易想到设计两个状态分别对应“没有删除元素”和“删除了一个元素”。在这里我们令dp0[i]表示:我们从未删除过元素、截止到i的最长连续递增序列的长度。同理令dp1[i]表示:我们已经删除过一个元素、截止到i的最长连续递增序列的长度。特别注意我们的定义,所谓“截止到i”,意思是这个最长递增序列必须以i结尾(即包含nums[i])。也就是说,如果我们打算删除第i个元素,那么dp1[i]就应该是0.

先考虑dp0[i],它有两个来源。首先,如果nums[i]>nums[i-1],显然这个递增序列可以在前一个未使用删除权力的递增序列的基础上延长,即```dp0[i] = dp0[i-1]+1```. 其次,如果nums[i]<=nums[i-1],那么以“截止到i的最长递增序列”只能是它自身,也就是```dp0[i] = 1```.

在考虑dp1[i],它也有两个来源。首先,就是我们已经使用过了删除权力,那么我们可以在前一个已经使用删除权力的递增序列的基础上延长,即```dp1[i] = dp1[i-1]+1```,当然前提是nums[i]>nums[i-1]. 另外一个来源就是在这个回合使用删除权力。记住,我们不能删除nums[i]本身,因为dp1[i]的定义要求包含nums[i],我们只能删除nums[i-1](否则就会等同于前述的情况),这样dp1[i]是接在上一个未使用删除权力的递增序列的基础上延长,即```dp1[i] = dp0[i-2]+1```. 最后dp1[i]在这两个source中选较大的那个。

最终的答案是查看所有i的位置,如果有```dp0[i]>=n```或者```dp1[i]>=n-1```就说明实现目标。

#### 解法2:
令maxNon表示截止到目前为止、未使用过删除权力、最长第增序列的最大值;令maxUsed表示截止到目前为止、已经使用过删除权力后、最长第增序列的最大值。这里不要求当前元素一定是这个递增序列的一部分。

如果当前元素大于maxNon,那么maxNon就可以更新。反之,那么就无法延续当前的递增序列,我们令maxNon为无穷大。

如果当前元素大于maxUsed,那么maxUsed就可以在原先的maxUsed基础上更新;反之,那么就无法延续当前的递增序列,我们令maxUsed为无穷大。同时还有另外一种可能,就是删除当前的元素,那么maxUsed就继承maxNon.

最终maxNon或者maxUsed任意一个为非无穷大的话,说明有解。

0 comments on commit 5c61833

Please sign in to comment.