C++优选算法 | 双指针篇(一)

283.移动零

题目描述

输入输出示例

解题

算法思路

  • 创建cur、dest两个指针,从 [ 0,dest ) 为处理好的数组,dest指向最近的一个0,[ dest,cur ]为0,( cur,nums.size()-1 ]为未处理的数组
  • 依次挪动两个指针直到cur指向数组末尾

C++代码演示

cpp 复制代码
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int cur=0;
        int dest=-1;
        while(cur!=nums.size())    //遍历数组
        {
            if(nums[cur]==0)    //为0则继续向后走
            {
                cur++;
            }
            else    //不为0则交换dest下一个元素(为0)
            {
                swap(nums[++dest],nums[cur++]);
            }
        }
    }
};

1089.复写零

题目描述

输入输出示例

解题

算法思路

  • 创建两个指针,先从前往后遍历,找到输出时最后一个数字的位置
  • 根据指针位置从后往前遍历,填入对应值

C++代码演示

cpp 复制代码
class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        int cur=0;
        int dest=-1;
        //从前往后走
        //通过循环找到输出是数组最一个值的位置cur
        while(cur<arr.size())
        {
            if(arr[cur]!=0)
            {
                dest++;
            }else
            {
                dest+=2;
            }

            if(dest>=arr.size()-1)    //表明当前的cur已经要输出数组的最后一个值了
            {
                break;
            }
            cur++;
        }

        //处理边界情况,如果cur为0的话,dest可能会超出下标范围[0,arr.size()-1]到n
        //这样的话最后一个值应为为0
        if(dest==arr.size())
        {
            arr[arr.size()-1]=0;
            cur--;
            dest-=2;    //到arr.size()-2位置
        }

        //从后往前走
        //改变数组
        while(cur>=0)
        {
            if(arr[cur]!=0)
            {
                arr[dest]=arr[cur];
                dest--;
                cur--;
            }else
            {
                arr[dest]=arr[dest-1]=0;
                dest-=2;
                cur--;
            }
        }
    }
};

202.快乐数

题目描述

输入输出示例

解题

算法思路

  • 因为走很多步之后必定会陷入一个循环当中,1的循环为1,2->4->16->37->58->89->145->42->20->4,所以必定有一个环
  • 创建两个指针,慢指针每次算一次,快指针每次算两次,必定会相遇,查看相遇时的值是否相等就可以了

C++代码演示

cpp 复制代码
class Solution {
public:
    int Sum(int n)  //返回n这个数每一位上的平方和
    {
        int sum=0;
        while(n)
        {
            int last=n%10;  //最后一位的值
            sum+=last*last;
            n/=10;
        }
        return sum;
    }
    bool isHappy(int n) {
        int slow=n; //快慢指针
        int fast=Sum(n);
        while(fast!=slow)
        {
            slow=Sum(slow);     //slow走一步
            fast=Sum(Sum(fast));    //fast走两步
        }
        return fast==1;
    }
};

11.盛最多水的容器

题目描述

输入输出描述

解题

算法思路

  • 创建左右两个指针,让他们往中心移动
  • 因为向中心移动时宽度变小,所以要让容器能盛更多的水,需要让高度变大,所以每次放弃高度较小的那条边

C++代码演示

cpp 复制代码
class Solution {
public:
    int maxArea(vector<int>& height) {
        int left=0;
        int right=height.size()-1;
        int ret=0;
        while(left<right)
        {
            ret=max(ret,min(height[left],height[right])*(right-left));
            if(height[left]<height[right])
            {
                left++;
            }
            else
            {
                right--;
            }
        }
        return ret;
    }
};
相关推荐
_F_y1 小时前
MySQL用C/C++连接
c语言·c++·mysql
兩尛1 小时前
c++知识点2
开发语言·c++
fengfuyao9851 小时前
海浪PM谱及波形的Matlab仿真实现
开发语言·matlab
xiaoye-duck2 小时前
C++ string 底层原理深度解析 + 模拟实现(下)——面试 / 开发都适用
开发语言·c++·stl
Azure_withyou2 小时前
Visual Studio中try catch()还未执行,throw后便报错
c++·visual studio
琉染云月2 小时前
【C++入门练习软件推荐】Visual Studio下载与安装(以Visual Studio2026为例)
c++·visual studio
Hx_Ma163 小时前
SpringMVC框架提供的转发和重定向
java·开发语言·servlet
期待のcode3 小时前
原子操作类LongAdder
java·开发语言
L_09074 小时前
【C++】高阶数据结构 -- 红黑树
数据结构·c++
lly2024064 小时前
C 语言中的结构体
开发语言