10 1 6 2 1 -2 3 5 2 -4 3
5
题解一:最大覆盖问题算法设计 - 豆丁网
10
-10 6 2 1 -2 3 5 2 -6 9
答案是10,因为9比前面任何一个数都大,这和绝对值递增并无关系。
题解二:我的思路是dp。dp[i]表示以第i个为结尾的最大覆盖长度。然后枚举第i + 1个时,如果其abs还比a[i]小,那么dp[i + 1] = 1,就是自己一个了。
否则,因为它比a[i]大了,而a[i]之前也算好了dp[i],就是[i - dp[i] + 1, dp[i] ]这段区间是比abs(a[i])小的了,所以可以不比较这段区间,直接和i - dp[i]比较即可。然后递归下去。
错误点:a[i] 例如 5
6 3 4 -5 1
当计算到1时,注意1的绝对值比-5大,但是你不能继承-5覆盖的区间。OJ上此题目可用暴力枚举的方法通过,枚举j元素左边有多少个满足条件元素,这是O(n^2)平方级算法:
OJ题解:双指针法
初始时,用两个指针i和j指向串末,当ai和aj的关系满足不等式时,j不动,i往左
走,……,直到不等式不满足,记录下长度。
下一步j往左移一个,i不回退,继续上面的比较,若找到更长的覆盖长度,更新。
每循环一次要么i要么j少1;最后i=-1,j=0;共进行了2(n-1)次。所以时间复杂度为O(n)。