有序数组/链表去重 – 快慢指针
Leecode 26题 : 有序数组去重
快指针表示遍历数组到达的下标位置,慢指针表示下一个不同元素要填入的下标位置
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()==0) return 0;
int slow=0,fast=0;
while(fast<nums.size()){
if(nums[slow] != nums[fast]){
slow++;
nums[slow] = nums[fast];
}
fast++;
}
return slow+1;
}
};
力扣第 83 题 : 有序链表去重
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==nullptr) return nullptr;
ListNode *slow,*fast;
slow=fast=head;
while(fast!=nullptr){
if(fast->val != slow->val){
slow->next = fast;
slow=slow->next;
}
fast=fast->next;
}
slow->next = nullptr;
return head;
}
};
移除元素
力扣第 27 题
[0 slow)
为不等 val
元素区间
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow=0,fast=0;
while(fast<nums.size()){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
fast++;
}
return slow;
}
};
移动零
力扣第 283 题
相当于移除nums中的所有 0,然后再把后面的元素都赋值为 0
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int p=this->removeElement(nums,0);
for(;p<nums.size();p++)
nums[p]=0;
}
int removeElement(vector<int>& nums,int val){
int fast=0,slow=0;
while(fast < nums.size()){
if(nums[fast] !=val){
nums[slow]=nums[fast];
slow++;
}
fast++;
}
return slow;
}
};