数据结构-线性表(数组)-原地算法 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;
    }
};

你可能感兴趣的:(LeetCode,英雄哥算法入门指引,leetcode,算法,c++)