双指针的算法原理,通过两个指针在一个for循环下完成两个for循环的工作。时间复杂度从optimizing变为.双指针的算法模板比较简单,突破点主要是找到题目中的单调性,从而加以利用。快慢指针快慢指针是一种链表操作技巧,它还有一个有趣的名字,龟兔赛跑。删除元素:classSolution{public:intremoveElement(vector&nums,intval){intslowIndex=0;for(intfastIndex=0;fastIndexnext){fast=fast->next->next;slow=slow->next;if(fast==slow)break;}if(fast&&fast->next){slow=head;while(slow!=fast){slow=slow->next;fast=fast->next;}returnslow;}returnullptr;}};链表中间节点:使用快慢指针,快指针走两步,慢指针走一步。当快指针走到尽头时,慢指针正好走到一半,返回的是中间节点。删除链表的最后第N个节点:快指针先移动n步,然后快指针和慢指针同时移动,当快指针到达末尾时,慢指针在最后第n个位置。反向指针反向指针的经典问题是N和系列和二分变体。Nsum系列的经典题目是:三数之和defthreeSum(nums):nums.sort()#[-4,-1,-1,0,1,2]res_list=[]#头循环搜索foriinrange(len(nums)):#必须判断nums[i]>nums[i-1]的条件ifi==0ornums[i]>nums[i-1]:#Leftmostl=i+1#Rightmostr=len(nums)-1whileellandnums[r]==nums[r+1]:#从右到左,同值直接跳过r-=1eliftthree_sum>0:#大于零,右边的值较大,左移r-=1else:#小于零,左值小,右移l+=1returnres_list四种二分变体中,根据王征的算法专栏,硬编码low=0,high=len(list)-1.循环条件低<=高。左移high=mid-1,右移low=mid+1defbinary_search(nums,target):'''标准二元算法模板'''low=0high=len(nums)-1#注意1low和high是用tracklist中要查找的部分whilelow<=high:#Note2只要没有被缩减到只有一个元素,继续检查mid=(low+high)//2iflist[mid]==target:returnmideliflist[mid]>target:high=mid-1#注意3猜的数偏大eliflist[mid]>1)需要双展开mid=low+((high-low)>>1)ifnums[mid]target:high=mid-1else:ifmid==0ornums[mid-1]!=target:returnmidelse:high=mid-1return-1defbsearch_high(nums,target):'''找到最后一个等于固定值的'''low=0higt=len(nums)-1whilelow<=higt:mid=low+((higt-low)>>1)ifnums[mid]>target:higt=mid-1elifnums[mid]>1)ifnums[mid]>=target:ifmid==0ornums[mid-1]>1)ifnums[mid]<=target:if(mid==len(nums)-1)or(nums[mid+1]>target):returnmidelse:low=mid+1else:higt=mid-1return-1slidingwindow原文:https://mp.weixin.qq.com/s/ioKXTMZufDECBUwRRp3zaA滑动窗口算法是双指针技术的最高境界,主要用于匹配两个字符串的问题。掌握滑动窗口的解题模板,可以轻松解决一系列字符串匹配问题。以下模板代码来自labuladong,解决LeetCode76题,MinimumWindowSubstring,求最小覆盖子串。/*滑动窗口算法框架*/stringminWindow(strings,stringt){//两个unordered_map,一个需要记录modestring中的字符个数,一个window记录窗口的字符unordered_map需要,window;//初始化needfor(charc:t)need[c]++;intleft=0,right=0;//两个unordered_maps的合格数intvalid=0;//记录起始索引和最小覆盖长度substringintstart=0,len=INT_MAX;while(right