leecode - 入门 -- 双指针秒杀数组/链表题目

有序数组/链表去重 – 快慢指针

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){
                // nums[slow] = nums[fast];
                slow->next = fast;
                // slow++;
                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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值