leetcode 27 移除元素

客官°小女子只卖身不卖艺 2022-09-07 05:00 317阅读 0赞

前言

题目:27. 移除元素

参考答案:移除元素-力扣官方题解、移除元素-代码随想录


提交代码

题目限定:用vector来存储数据;不可以使用额外的空间。

所以:这道题目不能使用标记的方式(使用额外空间,标记需要删除元素的下标)解决;由于是顺序存储,直接删除的复杂度过高;题目给出的提示是,将需要删除的内容交换到数组后面(这是题目的思路);

我使用“前后指针”实现上面的思路;答案使用“快慢指针”实现上面的思路。

前后指针的优缺点:交换的内容少;改变了原有的序列;交换完毕之后需顺序遍历一遍,以找到分界位置。时间复杂度为 2 ∗ O ( n ) 2*O(n) 2∗O(n)。

快慢指针的优缺点:不改变了原有的序列;交换完毕之后,慢指针指向的位置即为分界位置;交换的内容多;时间复杂度为 O ( n ) O(n) O(n)。

总的来说,我更倾向于快慢指针。

左右指针实现

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. class Solution {
  6. public:
  7. int removeElement(vector<int>& nums, int val) {
  8. int left=0, right=nums.size()-1;
  9. while(left<right){
  10. while((nums[left]!=val) && (left<right)) // 从前向后找第一个val位置
  11. left++;
  12. while((nums[right]==val) && (left<right)) // 从后向前找第一个非val位置
  13. right--;
  14. // if(left<right)
  15. // swap(nums[left],nums[right]);
  16. swap(nums[left],nums[right]); // 只有最后一次,自己和自己(不影响),避免每次检查
  17. left++;
  18. right--;
  19. }
  20. int i=nums.size()-1;
  21. for(; i>=0; i--)
  22. if(nums[i]!=val)
  23. return i+1; // 前面非val长度
  24. return 0;
  25. }
  26. };
  27. int main(void){
  28. vector<int> nums = {3,2,2,3}; int val = 3;
  29. Solution s;
  30. int len = s.removeElement(nums,val);
  31. cout<<len<<endl;
  32. for(int i=0; i<len; i++)
  33. cout<<nums[i]<<" ";
  34. return 0;
  35. }

快慢指针实现

  1. class Solution {
  2. public:
  3. int removeElement(vector<int>& nums, int val) {
  4. int slowIndex=0,fastIndex=0;
  5. int len = nums.size();
  6. /// 没有要处理内容的时候,快慢指针一起向前走。
  7. /// 遇到需要处理内容的时候,慢指针留下标记,快指针继续向前走。
  8. /// 本题为例,使用[slowIndex,fastIndex)标记可以被填充的区域。[0,slowIndex)为非val列表
  9. for(; fastIndex<len; fastIndex++){
  10. if(nums[fastIndex]!=val){
  11. nums[slowIndex] = nums[fastIndex];
  12. slowIndex++;
  13. }
  14. }
  15. return slowIndex;
  16. }
  17. };

发表评论

表情:
评论列表 (有 0 条评论,317人围观)

还没有评论,来说两句吧...

相关阅读

    相关 LeetCode27. 元素

    难度:`简单` 题目描述: > 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 > 不要使用额外

    相关 LeetCode27. 元素

    给定一个数组 nums 和一个值 val,你需要[原地][Link 1]移除所有数值等于 val 的元素,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在[原地][

    相关 leetcode:27.元素

    题目描述: 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入