leetcode-27. 移除元素+26. 删除有序数组中的重复项+283. 移动零+977. 有序数组的平方

27. 移除元素

题目链接

解题思路
简单题,使用双指针求解,这里使用头尾指针,把等于val的扔到数组后边就行。一个指针l从头开始,另一个指针r从末尾开始。若前边有等于val的元素,就与指针r交换并且指针r前移,l指针不动,因为并不知道交换到l位置上的元素是否等于val;否则指针l后移继续遍历。

class Solution {
public:
    int removeElement(vector<int>& nums, int val) 
    {
        int l=0,r=nums.size()-1;
        while(l<=r)
        {
            if(nums[l]==val)
            {
                swap(nums[l],nums[r]);
                r--;
            }
            else l++;
        }
        return l;
    }
};

26. 删除有序数组中的重复项

题目链接

解题思路

简单题,同样使用双指针求解。这道题不需要考虑数组中超出新长度后面的元素。所以只需要快一个指针r遍历数组,另一个慢指针l从头开始更新nums。先保留第1个元素,若后边的元素与当前元素相等,则指针r后移,否则更新nums,由于l是初始值是0,而且nums是保留第一个元素的,所以更新完之后的l是新数组的最后一个元素下标,新数组的长度就是l+1

class Solution {
public:
    int removeDuplicates(vector<int>& nums)
    {
        int l=0,r=1;
        while(r<nums.size())
        {
            if(nums[l]==nums[r])r++;
            else nums[++l]=nums[r];//更新数组
        }
        return l+1;
    }
};

283. 移动零

题目链接

解题思路
简单题,继续双指针。这道题跟27.移除元素很像,不过这里不是首尾指针。使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。

注意:这道题目要求新数组元素的相对位置是不发生改变的

class Solution {
public:
    void moveZeroes(vector<int>& nums) 
    {
        int i=0,j=0;
        while(i<nums.size())
        {
            if(nums[i]!=0)
            {
                swap(nums[j],nums[i]);
                j++;
            }
            i++;
        }
    }
};

977. 有序数组的平方

题目链接

解题思路

简单题,采用双指针求解。如果平方之后不排序,那么数组就是是两头大中间小的,把它变成非递减的,那么只需要在首尾找最大的值,作为新数组的最好一个元素,然后在原数组中缩小范围继续查找。
结合代码更好理解。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) 
    {
        int n=nums.size();
        vector<int>res(n);
        int l=0,r=n-1;
        while(l<=r)
        {
            if(abs(nums[l])>abs(nums[r]))res[--n]=nums[l]*nums[l++];//l右移
            else res[--n]=nums[r]*nums[r--];//r左移
            //l和r的变化就体现了范围的收缩。
        }
        return res;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值