【刷题篇】双指针(一)

发布于:2024-05-07 ⋅ 阅读:(178) ⋅ 点赞:(0)

1、移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
在这里插入图片描述

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

2、复写零

给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。
注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。
在这里插入图片描述

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        int n = arr.size();
        //从前往后会覆盖数据,所以就需要从后往前
        //在开始之前需要找到最后需要复写的位置
        
        int cur = 0;
        int dest = -1;
        while (cur < n)//分为四部,1、先对cur进行判断,
        {                       //2、进行判断dest走几步,判断走几步是通过cur位置的结果决定的
            if(arr[cur])        //3、判断dest位置
                dest++;         //4、cur++
            else
                dest+=2;
            if(dest>=n-1)
                break;
            cur++;
        }
        if (dest==n)
        {
            arr[n - 1] = 0;
            dest -= 2;
            cur -= 1;
        }
        while (cur >= 0)
        {
            arr[dest] = arr[cur];
            if (arr[cur] == 0)
                arr[--dest] = 0;
            cur--;
            dest--;
        }
    }
};

3、快乐数

编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

class Solution {
public:
    int assist(int n)
    {
        int sum=0;
        while(n>0)
        {
            int dummy=n%10;
            n/=10;
            sum+=pow(dummy,2);
        }
        return sum;
    }
    //快慢指针
    bool isHappy(int n) {
        int slow=n;
        int fast=assist(n);
        while(slow!=fast)
        {
            slow=assist(slow);
            fast=assist(assist(fast));
        }
        return slow==1;
    }
};

4、盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
在这里插入图片描述

class Solution {
public:
    int maxArea(vector<int>& height) {
        int n=height.size();
        int left=0;
        int right=n-1;
        int maxi=0;
        while(left<right)
        {
            if(height[left]>height[right])
            {
                int sum=(right-left)*height[right];
                maxi=max(maxi,sum);
                right--;
            }
            else
            {
                int sum=(right-left)*height[left];
                maxi=max(maxi,sum);
                left++;
            }
        }
        return maxi;
    }
};

网站公告

今日签到

点亮在社区的每一天
去签到