双指针练习
一、完美数列(PAT乙级1030)
下面是书中代码
算法思想
首先使数列有序,对于有序递增的数列,可以得出a[j]<=a[i]*p成立,那么在i到j这个递增区间中的所有数都对这个等式成立,也就是说一次性找到一个区间,这个区间中都是符合a[j]<=a[i]*p的数,i为区间开始的元素,也是区间中最小的元素,i~j是递增的,所以一定可以找到这个区间的右边界,此时区间中的数就都是符合要求的,然后让i++找下一个区间。
这种方法类似于一个可改变大小的滑动窗口,每次确定窗口的左边界,然后找符合要求的右边界。因为要找出最大的那个窗口,所以count的赋值需要借助于max函数,用三目表达式也行使用三目表达式方法。
算法分析
即使使用最快的排序算法时间复杂度也有O(nlogn)而且还有一次数组的遍历操作O(n),所以最终时间复杂度为O(nlogn),根据题意分析这道题的最好时间复杂度应该就是O(nlogn)
原文:https://www.cnblogs.com/zyq79434/p/14856706.html