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;
    }
};
相关推荐
xieliyu.4 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
CryptoPP5 小时前
快速对接东京证券交易所API数据:实战指南与代码示例
开发语言·人工智能·windows·python·信息可视化·区块链
ZC跨境爬虫5 小时前
跟着 MDN 学JavaScript day_7:数学运算与逻辑判断实战测试
开发语言·前端·javascript·学习·ecmascript
阳区欠6 小时前
【LangChain】LLM基础介绍
开发语言·python·langchain
Jinkxs6 小时前
Java 跨域14-Java 与区块链(Hyperledger)集成
java·开发语言·区块链
晨曦中的暮雨7 小时前
Golang速通(Javaer版)
java·开发语言·后端·golang
小小编程路7 小时前
Python 还有容器类型互转、进制转换、字符编码转换
开发语言·windows·python
Qt程序员7 小时前
Linux RCU 原理与应用
linux·c++·内核·linux内核·rcu
qeen878 小时前
【C++】类与对象之类的默认成员函数(二)
android·c语言·开发语言·c++·笔记·学习
CRMEB系统商城8 小时前
CRMEB多商户系统(Java)v2.3公测版发布
java·开发语言·人工智能·小程序·开源·php