当前位置:   article > 正文

leetcode 27. 移除元素_nums.erase

nums.erase

2023.5.24

题目描述:

        这道题要求我们原地移除元素 ,我第一反应是想到了vector的erase方法,这里先复习以下vector的几种删除元素的方法:

         这里使用第二种,删除指定位置的元素。但是这里有一点要注意:在删除完当前元素时,后面的元素会向前移动。直接看代码:

第一种方法:erase法(本人解)

  1. class Solution {
  2. public:
  3. int removeElement(vector<int>& nums, int val)
  4. {
  5. int n = nums.size();
  6. for(int i=0; i<n; i++)
  7. {
  8. if(nums[i] == val)
  9. {
  10. nums.erase(nums.begin()+i);
  11. i--; //删除完当前元素,后续元素会向前移动。
  12. n--; //元素的size也需要-1。
  13. }
  14. }
  15. return nums.size();
  16. }
  17. };

         当然,正常来说不应该使用erase函数,这里我在用个笨方法,双重for循环。

第二种方法:暴力解(本人解)

  1. class Solution {
  2. public:
  3. int removeElement(vector<int>& nums, int val)
  4. {
  5. int n = nums.size();
  6. for(int i = 0; i < n; i++)
  7. {
  8. if(nums[i] == val)
  9. {
  10. for(int j = i; j < n-1; j++)
  11. {
  12. nums[j] = nums[j+1];
  13. }
  14. n--;
  15. i--;
  16. }
  17. }
  18. return n;
  19. }
  20. };

第三种方法:双指针(快慢指针)

        看了下题解的双指针思路,也是自己敲出来双指针的代码了,舒服。

  1. class Solution {
  2. public:
  3. int removeElement(vector<int>& nums, int val)
  4. {
  5. int i=0, j=0; //双指针
  6. int n = nums.size(); //记录新数组的元素个数
  7. while(j < nums.size())
  8. {
  9. if(nums[j] != val)
  10. {
  11. nums[i] = nums[j];
  12. i++;
  13. j++;
  14. }
  15. else
  16. {
  17. n--;
  18. j++;
  19. }
  20. }
  21. return n;
  22. }
  23. };

        双指针思路还是挺迷妙的,这里是定义了一个快指针一个慢指针,快指针走得快,用于遍历原始数组的元素,看看是否等于val值。 而慢指针走的慢,它用来维护新数组(即目标数组)的元素,接受所有满足条件(即元素值不等于val)的元素。

        这里我一开始while循环里写的是j<n,运行发现出错。 然后自己用手推了一下整个过程,很容易就发现这个错误了,于是改成 j<nums.size()了。 因为n是新数组的长度,而我们这里需要的是原始数组(即nums)的长度。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/611502
推荐阅读
相关标签
  

闽ICP备14008679号