错题
leetcode 354. 俄罗斯套娃信封问题
错因和思路:1.心态:因为是自己原来做过的题目就掉以轻心了,导致情况没有考虑周全
2.思路:将宽度进行排序,高度没管,如果相同就不改变二分后找到的修改位置,显然这会少答案要的长度
思路引导:这里根据题目描述很容易想到递增子序列并将其排序,但是当将宽度进行排序后,会发现高度的选取很麻烦,如果是找递增子序列还是要管宽度问题,比如说 [[30,50],[12,2],[3,4],[12,15]]
既然如此,那就得换种思路,宽度排序是必须的,怎么才可以在讨论高度的时候不讨论宽度问题呢?从高处下手,既然不要选同样的,我们又是要找递增自序列,大胆想象一下,我们可以在宽度相同的情况下,将高度呈不上升子序列,如此便
可
洛谷P8776 [蓝桥杯 2022 省 A] 最长不下降子序列
错因和思路:这里太兴奋了哈哈没想太多直接找出最长不下降子序列,然后找了个最长的递增子数组,和k取一个min
思路引导: 首先应该会想到找直接找出最长不下降子序列,然后在里面每个子序列间考虑,不仅要记录是不是最长子序列里面的,还要考虑会不会跨,而且一般来讲我们都不记录最长子序列到底有哪些数,只记录答案,所以很麻烦,因此暂时PASS
当问题看似棘手时,就要跳出当前思路,退一步海阔天空
从上面PASS的方案可以看出,其实整个数组的任意连续的k个数都有可能刷成某个数后使得整个数组的最长不下降子序列变长,因此,我们可以枚举k的位置,像固定的滑窗一样[l,r)(根据个x人习惯),这样的话我们只需考虑边界0——l-1
的最长不降子序列(最后一个值不大于nums[r]),以及r——n-1的最长不降子序列即可
其实,从上面的方案,还可以从另一个角度发现这个思路.就是既然我们可能要跨界限,就不好在算上最长不降子序列的长度后又去处理刷出来的有效的长度,既然如此,秉持着考虑可能性的原则,我们就直接在我们要的答案中的两个界限
找k个数,什么意思?这里分两种情况假设(注:这里是找到的最终答案,所以不存在跨界情况)
我们要……A…… B…… C…… [k个被刷的数]…… D…… E……
……A…… B…… C…… [k个被刷的数] D…… E……
obviously,上面的情况和下面的情况的答案实际上是等效的,所以我们直接枚举k个数在哪,然后找左边界的最长不降子序列和右边界开始的最长不降子序列即可
大体流程明白,现在就是怎么找不降子序列的问题。
1)从0_i的 这里最原始的方法就是dp[i]=dp[j]+1 其中是从0-i-1中找到nums[j]<=nums[i],复杂度比较高,那我们换种思路,就是加一个辅助数组end,表示长度为x的最长不下降子序列的最小的结尾的数是啥,每碰到一个数,就用二
分在里面找一个>这个数 的数的位置,如果没有就说明没有在目前最长的不下降子序列中这个数是最大的数,那么在end的有效长度的后面记录这个数值,并将有效长度扩大。如果找到了,覆盖即可,并在dp[i]=x
2)从i_n-1的 这个用倒序的最长不下降子序列即可