经典双指针算法试题(一)

在这里插入图片描述


北尘_:个人主页

个人专栏:《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》

☀️走在路上,不忘来时的初心

文章目录

  • 一、移动零
    • 1、题目讲解
    • 2、讲解算法原理
    • 3、代码实现
  • 二、复写零
    • 1、题目讲解
    • 2、讲解算法原理
    • 3、代码实现
  • 三、盛水最多的容器
    • 1、题目讲解
    • 2、讲解算法原理
    • 3、代码实现
  • 四、快乐数
    • 1、题目讲解
    • 2、讲解算法原理
    • 3、代码实现


一、移动零

1、题目讲解

经典双指针算法试题(一)_第1张图片

2、讲解算法原理

经典双指针算法试题(一)_第2张图片

3、代码实现

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        for(int cur=0,dest=0;cur<nums.size();cur++)
        {
            if(nums[cur])
            {
                swap(nums[cur],nums[dest++]);
            }
        }
    }
};

二、复写零

1、题目讲解

经典双指针算法试题(一)_第3张图片

2、讲解算法原理

经典双指针算法试题(一)_第4张图片

经典双指针算法试题(一)_第5张图片

经典双指针算法试题(一)_第6张图片

经典双指针算法试题(一)_第7张图片

3、代码实现

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        int cur=0,dest=-1,n=arr.size();
        while(cur<n)
        {
            if(arr[cur]) dest++;
            else dest+=2;
            if(dest>=n-1) break;
            cur++;
        }
        if(dest==n)
        {
            arr[n-1]=0;
            cur--;
            dest-=2;
        }
        while(cur>=0)
        {
            if(arr[cur]) arr[dest--]=arr[cur--];
            else 
            {
                arr[dest--]=0;
                arr[dest--]=0;
                cur--;
            }  
        }  
    }
};

三、盛水最多的容器

1、题目讲解

经典双指针算法试题(一)_第8张图片
经典双指针算法试题(一)_第9张图片

2、讲解算法原理

经典双指针算法试题(一)_第10张图片

3、代码实现

class Solution {
public:
    int maxArea(vector<int>& height) {
        int max=0,begin=0,end=height.size()-1;
        while(begin<end)
        {
            if(height[begin]>height[end])
            {
                int v1=height[end]*(end-begin);
                if(v1>max)
                max=v1;
                --end;
            }
            else
            {
                int v2=height[begin]*(end-begin);
                if(v2>max)
                max=v2;
                ++begin;
            }
        }
        return max;
    }
};

四、快乐数

1、题目讲解

经典双指针算法试题(一)_第11张图片

2、讲解算法原理

经典双指针算法试题(一)_第12张图片

3、代码实现

class Solution {
public:
    int bigsum(int n )
    {
        int sum=0;
        while(n)
        {
            int ret=n%10;
            sum+=ret*ret;
            n/=10;
        }
        return sum;
    }
    bool isHappy(int n) {
        int slow=n,fast=bigsum(n);
        while(fast!=slow)
        {
            fast=bigsum(bigsum(fast));
            slow=bigsum(slow);
        }
        return slow==1;
        
    }
};

你可能感兴趣的:(经典算法试题,算法)