数据结构-线性表(数组)-原地算法 27.移除元素--左右指针细节处很重要

法一:双指针法(快慢指针):从头出发,在原位刷新一个新数组,慢指针代表新的数组的尾部,快指针遍历原数组。对不等于val的值,从原数组中添加到新数组的尾部。第二次没做出来

class Solution 
{
public:
    int removeElement(vector<int>& nums, int val) 
    {
        int len = nums.size();
        int j = 0;
        for(int i = 0;i<len;i++)
        {
            if(nums[i] != val)
            {
                nums[j] = nums[i];
                j++;
            }
        }
        return j;
    }
};

**法二:双指针优化(左右指针):**从两边出发,左指针指新数组尾部,右指针选择不等于val的元素覆盖左指针指向的等于val的元素,当两指针重合时,遍历完原数组。(左)右指针指向的元素使用完后立即(右)左移右指针
第三遍总结:right必须从nums.size()开始,且左值针指向的元素是需要进行判断的,也就是左值针左边就是要被输出的元素。如果 right 从 nums.size()-1 开始,则当左右指针同时指向一个数时,该元素会被漏掉。我们的目的就是遍历所有的元素

class Solution {
public:
    int removeElement(vector<int>& nums, int val) 
    {
        int left = 0, right = nums.size();
        while (left < right) 
        {
            if (nums[left] == val)
            { 
                  nums[left] = nums[right - 1];
                  right--;
            } 
            else 
            {
                left++;
            }
        }
        return left;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值