数组分块
题型特点:给一个数组,在某个规则下将数组划分成几个区间
解决:双指针(数组中利用下标充当指针)
283 移动0
定义两个指针
- dest指针(已处理区间内非0元素的最后一个位置)
- cur指针(遍历整个数组)
- 两个指针从左往右走时,会将数组划分成三个区间
[0,dest]
非0区间
[dest+1,cur-1]
0区间
[cur,n-1]
未处理区间
最右边的区间不存在了,整个区间就划分成功- cur指针遇见非0元素,要将该元素加入到第一个区间中,dest就要向后移动一下
- dest++后指向的一定是0元素,和cur当前的元素交换一下
1089 复写0
双指针是从异地操作,优化成就地操作
分析:
- 从左向右的原地操作会覆盖一些元素
dest在++时,会超过cur指针的位置- 从后向前走,dest在最后一个位置,cur在4的位置
- 找到最后一个复写的数也要使用双指针
cur≠0,dest向后走一步
cur=0,dest向后走两步- 判断一下dest是不是最后一位
- 附加一步,如果cur指向了0,dest只需修改dest-1位置处的元素
202 快乐数
数有两种情况,一个是变道1(一直是1变相的也是一个环),一个是陷入一个环
变相的快慢指针
11 盛水最多的容器
分析
- 两个指针指向数组两端,相乘得出一个体积值v1
- 如果先去掉7,那么1乘剩下的任何数都是比v1小的
高度不变的情况下,宽度在减小,所以1和剩下的数不用乘,肯定比v1小- 一直循环这个过程,会得出很多体积,保存下来比较即可
- 总体用了v=w*h,控制变量法,让h保持不变,w减小v肯定减小,从而排除不用遍历的情况