- sliding window
属于2 pointer的子集,都是从前往后走
例题:remove duplicated from sorted array
思路:end往后走直到最后一个different。然后start是第一个diff, 所以in place的算法是吧dif的ele move到start,start+1.
so start: is the first distinct的position
end是来判断,if dif的话就跟start换位置,if equal则end+1
思路:hashset可以用,o(n)和o(n)
duplicates可以用hashtable
例题:如果diuplicate的出现次数k,
思路:那么判断start的前面有几个,或者判断end-2和end是否一样或者j-i>=2
例题:remove element:(inplace)
start是第一个1的位置,然后end是non-1,然后swap,然后i+1,j都要加1,
所以一开始的start是先找到对应1(要先for),也可以不用
for(int i,j;i<len&j<len;j+1){ if (nums[i]!=1) start+=1}
例题: maximum average subarray.
start 是maxim的start。 end++,一个global max,然后更新start。end往前数,然后maximum可以减去头+尾。单个for就可以
思路:也可以累加,然后减去前面k的元素当前的和,然后就是当前的k个和
例题:sliding window 3
思路:rolling hash,利用hashcode计算,而且可以偷懒,类似于上面的去头加尾
例题:subarrayproduct less than k
start和end,end先移动到最小不满足,然后startmove到满足,这其中每一个sub都是满足的
但是计算的是number,而不是每一个subarray,所以j-i+1是多的validwindow,计算
例题: sliding window 2:
例题:minimum size subarray sum
思路:start,end中间的和,global存储当前的最短,if sum>k,则start+1. 然后继续end+1判断。 start<end肯定
for内嵌while (i),但是i和j相对独立,所以时间复杂度是O(n)
例题:sliding window IV
例题:longest substring without repeating characters
区分subsequence和esubarray
遇到duplicate,repeateing,exist,unique都可以用hashmap来解决