算法:双指针

数组分块

题型特点:给一个数组,在某个规则下将数组划分成几个区间
解决:双指针(数组中利用下标充当指针)

283 移动0

定义两个指针

  • dest指针(已处理区间内非0元素的最后一个位置)
  • cur指针(遍历整个数组)
  • 两个指针从左往右走时,会将数组划分成三个区间
    算法:双指针_第1张图片
  • [0,dest]非0区间
    [dest+1,cur-1]0区间
    [cur,n-1]未处理区间
    最右边的区间不存在了,整个区间就划分成功
  • cur指针遇见非0元素,要将该元素加入到第一个区间中,dest就要向后移动一下
  • dest++后指向的一定是0元素,和cur当前的元素交换一下

1089 复写0

双指针是从异地操作,优化成就地操作
算法:双指针_第2张图片

分析:

  • 从左向右的原地操作会覆盖一些元素
    dest在++时,会超过cur指针的位置
  • 从后向前走,dest在最后一个位置,cur在4的位置
  • 找到最后一个复写的数也要使用双指针
    cur≠0,dest向后走一步
    cur=0,dest向后走两步
  • 判断一下dest是不是最后一位
    算法:双指针_第3张图片
  • 附加一步,如果cur指向了0,dest只需修改dest-1位置处的元素

202 快乐数

算法:双指针_第4张图片
数有两种情况,一个是变道1(一直是1变相的也是一个环),一个是陷入一个环
变相的快慢指针

11 盛水最多的容器

算法:双指针_第5张图片
分析

  • 两个指针指向数组两端,相乘得出一个体积值v1
  • 如果先去掉7,那么1乘剩下的任何数都是比v1小的
    高度不变的情况下,宽度在减小,所以1和剩下的数不用乘,肯定比v1小
  • 一直循环这个过程,会得出很多体积,保存下来比较即可
  • 总体用了v=w*h,控制变量法,让h保持不变,w减小v肯定减小,从而排除不用遍历的情况

611 有效三角形的个数

算法:双指针_第6张图片

你可能感兴趣的:(算法,算法)