行业知识
【刷题】双指针入门
2026-11-09 02:02:43
来源:互联网转载
双指针入门
- 双指针
- 283.移动零
- 1089. 复写零
- 202. 快乐数
- 11. 盛最多水的容器
- Thanks♪(・ω・)ノ谢谢阅读!!!
- 下一���文章见!!!
双指针
双指针是非常经典的算法,包括但不限于前后双指针,快慢双指针,特殊双指针。
尤其需要注意的是双指针并不能只局限于指针,数组下标,过程数据都可以成为“指针”。重要的是能够灵活使用双指针的思想,把解题思路捋顺。
下面,我们来会会几道双指针的题目:
283.移动零
家人们 !!! 上连接:283.移动零
通过题目,发现这并不是一到很复杂的题。主要难点在于不改变数组的相对顺序。
这里我们使用前后双指针,逐渐遍历完成操作:
- 首先定义两个数组下标 i j
- 我们赋予他们不同含义:
[ 0 ,i)是已经处理过,已经没有零的部分 并按相对顺序排好
[i , j] 是零的部分
(j , n) 待处理的部分
- 我们控制 j 来进行整个数组的遍历,0 到 i是非零数据。
- 遇到 0 ,i j 位置互换即可
来看代码:(类似冒泡排序的过程,把零向后挪动)
class Solution {public: void moveZeroes(vector& nums) { for(int i = 0,j = 0;jpublic: void duplicateZeros(vector for(int i = 0;i if(arr[i] == 0){ for(int j = arr.size() - 1 ; j i ; j--){ arr[j] = arr[j - 1]; } ++i; } } }};public://操作函数 int getsum(int n ){ int sum = 0; while(n){ int i = n % 10; sum += i*i; n /= 10; } return sum; } bool isHappy(int n) {//初始化 int slow = n; int fast = getsum(n);//进行循环 直到相遇 while(slow != fast){ slow = getsum(slow); fast = getsum(getsum(fast)); } //判断一下即可 if(slow == 1) return true; return false; }};public: int maxArea(vector int i = 0; int j = height.size() - 1;// 记录答案值 int ans = 0; while(i != j){ //求得新的体积 int v = min(height[i],height[j]) * (j - i); //取最大值 ans = max(ans,v); // 移动较小的指针 if(height[i]