Leetcode 26. 删除有序数组中的重复项(简单) 83. 删除排序链表中的重复元素(简单) 27. 移除元素(简单) 283. 移动零(简单)数组操作原地移除
基本思想都是使用快慢指针,快指针去查找值,慢指针保存值
思路:
我们让慢指针 slow
走在后面,快指针 fast
走在前面探路,找到一个不重复的元素就告诉 slow
并让 slow
前进一步。这样当 fast
指针遍历完整个数组 nums
后,nums[0..slow]
就是不重复元素。
class Solution { public: int removeDuplicates(vector<int>& nums) { int slow=0,fast=0; while(fast<nums.size()){ if(nums[slow]!=nums[fast]){ slow++; nums[slow]=nums[fast]; } fast++; } return slow+1; } };
思路:
操作换为链表
class Solution { public: ListNode* deleteDuplicates(ListNode* head) { if(head==nullptr){ return head; } ListNode* slow=head; ListNode* fast=head; while(fast!=nullptr){ if(slow->val!=fast->val){ // nums[slow] = nums[fast]; slow->next=fast; // slow++; slow=slow->next; } fast=fast->next; } // 断开与后面重复元素的连接 slow->next=nullptr; return head; } };
题目:
思路:
题目要求我们把 nums
中所有值为 val
的元素原地删除,依然需要使用 双指针技巧 中的快慢指针:
如果 fast
遇到需要去除的元素,则直接跳过,否则就告诉 slow
指针,并让 slow
前进一步。
class Solution { public: int removeElement(vector<int>& nums, int val) { int l=0,r=0,n=nums.size(); for(r=0;r<n;++r) { if(nums[r]!=val) { nums[l++]=nums[r]; } } return l; } };
题目:
给你输入一个数组 nums
,请你原地修改,将数组中的所有值为 0 的元素移到数组末尾
比如说给你输入 nums = [0,1,4,0,2]
,你的算法没有返回值,但是会把 nums
数组原地修改成 [1,4,2,0,0]
。
思路:
与移除元素相同,在最后slow-n-1置零
class Solution { public: void moveZeroes(vector<int>& nums) { int slow=0,fast=0; while(fast<nums.size()){ if(nums[fast]!=0){ nums[slow]=nums[fast]; slow++; } fast++; } for(;slow<nums.size();++slow){ nums[slow]=0; } } };
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=