接下来也将进行算法的练习,先从简单的双指针开始,以8道列题来透彻理解算法双指针。
1、
定义两个指针,cur,dest
两指针的作用:cur:从左到右扫描数组,遍历数组
dest:已处理的区间内,非0元素的最后一个位置
cur:1>遇到0元素,cur++
2>遇到非0元素,swap(dest+1,cur);
dest++,cur++;
2、
先根据"异地"操作,然后优化成双指针下的就地操作
1>先找到最后一个复写的数
a、先判断cur位置的值
b、决定dest向后移动一步或者两步
c、判断一下dest是否已经到结束为止
d、cur++
1.5>处理一下边界问题
【1,0,2,3,0,4】此为特殊情况
2>从后向前完成

3、
这道题相当于判断链表是否有环
快慢双指针
a、定义快慢双指针
b、慢每次向后一步,快指针移动两步
c、判断相遇时候的值即可
4、
找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。
可以进行暴力枚举,但是会超时,不是最优解。所以利用单调性,使用双指针。
5、
暴力枚举依然可行,用伪代码简单说明一下
for(i=0;i<n;i++)
for(j=i+!;k<n;j++)
for(k=j+1;k<n;k++)
check(i,j,k)
这样写时间复杂度达到了o(n)
优化:先对整个数组排序
再利用单调性,使用双指针算法

x:a+b>c----->right-left,right--
y:a+b<=c------->left++
6、输入一个递增排序的数组和一个数字,再数组中查找两个数,使得它们的和正好时s,如果右多对数字的和等于s,则输出任意一对
若sum>t right--
sum<t left++
sum==t 返回结果

7、
这道题考验代码能力,需要多次练习
排序+暴力枚举+利用set去重,复杂
使用双指针加排序
a、排序
b、固定一个数
c、在该数后面的区间内,利用双指针快速找到两个的和等于-target即可
细节问题:不漏,找到一种结果,不要停,继续查找,当使用玩双指针算法之后,i也需要跳过重复的元素,注意避免越界。

8、
这道题与第7题类似,不再赘述
