小工具知识网

当前位置: 首页 > 行业知识 > 【刷题】双指针入门

行业知识

【刷题】双指针入门

2026-11-09 02:02:43 来源:互联网转载

双指针入门

  • 双指针
  • 283.移动零
  • 1089. 复写零
  • 202. 快乐数
  • 11. 盛最多水的容器
  • Thanks♪(・ω・)ノ谢谢阅读!!!
  • 下一���文章见!!!

    双指针

    双指针是非常经典的算法,包括但不限于前后双指针,快慢双指针,特殊双指针。

    尤其需要注意的是双指针并不能只局限于指针,数组下标,过程数据都可以成为“指针”。重要的是能够灵活使用双指针的思想,把解题思路捋顺。

    下面,我们来会会几道双指针的题目:

    283.移动零

    家人们 !!! 上连接:283.移动零

    通过题目,发现这并不是一到很复杂的题。主要难点在于不改变数组的相对顺序。

    这里我们使用前后双指针,逐渐遍历完成操作:

    1. 首先定义两个数组下标 i j
    2. 我们赋予他们不同含义:

      [ 0 ,i)是已经处理过,已经没有零的部分 并按相对顺序排好

      [i , j] 是零的部分

      (j , n) 待处理的部分

    3. 我们控制 j 来进行整个数组的遍历,0 到 i是非零数据。
    4. 遇到 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] 

上一篇:揭秘乡镇文档下载秘籍,轻松获取所需资料,一网打尽!

下一篇:服务器主机怎么安装centos?