【leetcode 刷题日记】03-移除元素

移除元素

题目就不叙述了,粘贴一直出错…

这道题看上去和删除重复元素很像,然后一开始我也在想能不能用相同的双指针思想来做,但是发现自己还是写不出来。
于是用的map去重以后再赋回原数组的方法,这个我没有提交哈哈因为感觉题目要求的是原地,应该没办法通过。
看了题解,确实是用的双指针的思想,今天通过这道题算是理解了快、慢指针是什么意思了。快指针遍历数组,慢指针把不等于val的值保存下来。
看了两次双指针思想,还是自己写不出来,感叹别人的代码好优雅,希望下次可以自己写出来。

解法一 跳过重复元素

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

解法二 重复元素和末尾交换

又看了下题目要求,可以无序
所以有解法二,遇到相同的元素时,和末尾的元素交换,同时释放末尾的一个元素,此时指针不自增,目的是继续扫描这个被替换上来的元素(有可能是我们要寻找的目标值)。

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

最近在帮师兄改论文的格式,感觉头好晕哈哈。
希望以后自己也能发篇论文吧~

发布了7 篇原创文章 · 获赞 4 · 访问量 181

猜你喜欢

转载自blog.csdn.net/fengshiyu1997/article/details/104639328
今日推荐