LeetCode——双指针(977. 有序数组的平方。189. 轮转数组。881. 救生艇。905. 按奇偶排序数组。633. 平方数之和)

本文介绍了使用双指针技术解决LeetCode上的几道经典问题,包括有序数组的平方、轮转数组、救生艇、按奇偶排序数组以及平方数之和。通过双指针优化算法,提高了问题的解决效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

训练题目

题目链接
977. 有序数组的平方传送门.
189. 轮转数组传送门.
978. 救生艇传送门.
979. 按奇偶排序数组传送门.
633. 平方数之和传送门.

题解

977. 有序数组的平方

1.普通方法

代码简单,但效率低下

class Solution {
public:
    vector<int> sortedSquares(vector<int>& a) {
        int len=a.size();
        vector<int>b;
        for(int i=0;i<len;i++)
        b.push_back(a[i]*a[i]);
        sort(b.begin(),b.end());
        return b;
    }
};

2.双指针解决,效率高

class Solution {
public:
    vector<int> sortedSquares(vector<int>& a) {
        int len=a.size();
        vector<int>b(len);
        int l=0,r=len-1;
        while(r>=l)
        {
            int m=a[r]*a[r];
            int n=a[l]*a[l];
            if(m>n)
            {
                b[len-1]=m;
                len--;
                r--;
            }
            else
            {
                b[len-1]=n;
                len--;
                l++;
            }
        }
        return b;
    }
};

189. 轮转数组

class Solution {
public:
    void rotate(vector<int>& a, int k) {
        int len=a.size();
        vector<int>b(len);
        for(int i=0;i<len;i++)
        {
            b[(i+k)%len]=a[i];
        }
        a.assign(b.begin(),b.end());
    }
};

881. 救生艇

class Solution {
public:
    int numRescueBoats(vector<int>& a, int limit) 
    {
        int len=a.size();
        sort(a.begin(),a.end());
        int cnt=0;
        int min=0;
        int max=len-1;
        while(min<=max)
        {
                if(a[max]+a[min]<=limit)
                {
                    min++;
                    max--;
                    cnt++;
                }
                else
                {
                    max--;
                    cnt++;
                }
            
        }
        return cnt;
    }
};

905. 按奇偶排序数组

class Solution {
public:
    vector<int> sortArrayByParity(vector<int>& nums) {
        vector<int>a;
        int len=nums.size();
        a.resize(len);
        int j=0;
        for(int i=0;i<len;i++)
        {
            if(nums[i]%2==0)
                a[j++]=nums[i];
        }
        for(int i=0;i<len;i++)
        {
            if(nums[i]%2!=0)
                a[j++]=nums[i];
        }
        return a;
    }
};

633. 平方数之和

class Solution {
public:
    bool judgeSquareSum(int c) {
        long i = 0, j = sqrt(c);
        while (i <= j) 
            if (i * i + j * j == c) return true;
            else if (i * i + j * j > c) j --;
            else i ++;
        return false;
    }
};


在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荒野大飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值