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;
    }
};
相关推荐
肆忆_19 小时前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星1 天前
虚函数表:C++ 多态背后的那个男人
c++
端平入洛3 天前
delete又未完全delete
c++
端平入洛4 天前
auto有时不auto
c++
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1235 天前
matlab画图工具
开发语言·matlab
dustcell.5 天前
haproxy七层代理
java·开发语言·前端
norlan_jame5 天前
C-PHY与D-PHY差异
c语言·开发语言
哇哈哈20215 天前
信号量和信号
linux·c++
多恩Stone5 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc