数组分块
题型特点:给一个数组,在某个规则下将数组划分成几个区间
解决:双指针(数组中利用下标充当指针)
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变相的也是一个环),一个是陷入一个环
变相的快慢指针