两种解法解决 LeetCode 27. 移除元素【C++】

移除元素

  • 27. 移除元素
    • 题目:[移除元素](https://leetcode.cn/problems/remove-element/description/)
    • 示例和提示:
    • 解法:
      • 1. 暴力解法
    • 2. 快慢指针

27. 移除元素

题目:移除元素

两种解法解决 LeetCode 27. 移除元素【C++】_第1张图片

示例和提示:

两种解法解决 LeetCode 27. 移除元素【C++】_第2张图片

解法:

1. 暴力解法

//暴力解法:
//实际上就是遍历数组找到需要删除的元素,然后再嵌套一层循环将该元素后面的依次向前覆盖。
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        //为了不让每次循环都调用size()函数:
        int size = nums.size();
        //第一步,遍历目标数组:
        for(int i = 0; i < size; i++)
        {
            //找到需要删除元素的位置;
            if(nums[i] == val)
            {
                //删除元素从前向后遍历:
                for(int j = i+1; j < size; j++)
                {
                    nums[j-1] = nums[j];
                }
                 //这里有一个迭代器失效问题,此时i指向原始数组中被删除元素的下一个位置,外层循环末尾
                 //还会使得i++,没有判断就跳过了这个元素,所以得i--;
            i--;
            size--;
            }
 
        }

        return size;
    }
};

2. 快慢指针

//快慢指针法:
//很酷很丝滑的解法,快指针勇往无前的遍历,慢指针负责将快指针指向位置的元素复制到自己指向的位置,
//当快指针指向位置的元素需要删除时,慢指针停止赋值,直到快指针再次指向一个不需要删除的元素的位置。

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int fastPoit = 0;
        int slowPoit = 0;
        int size = nums.size();
        for( ; fastPoit < size; fastPoit++)
        {
            if(nums[fastPoit] != val)
            {
                nums[slowPoit] = nums[fastPoit];
                slowPoit++;
            }
        }
        //slowPoit此时的指向正是新数组末尾的下一个位置,因为slowPoit++
        //是放在赋值最后执行的,所以刚好也就是新长度:
        return slowPoit;
    }
};

创作不易,你的点赞和关注都是对我莫大的鼓励,再次感谢您的观看

你可能感兴趣的:(算法刷题经验,leetcode,c++,算法)