《代码随想录》学习笔记:数组——快慢指针

本文详细介绍了快慢指针的概念,并通过分析LeetCode中的多个经典问题,如移除元素、删除有序数组重复项和移动零等,展示了如何运用快慢指针解决问题。同时,对不同版本的代码进行比较,探讨了快慢指针在优化算法效率方面的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

  一刷代码随想录,今天的内容是 快慢指针
  欢迎大家在评论区留言发表自己的看法,如文章有不妥之处,请批评指正。



一、快慢指针模板

  双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。

  • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
  • 慢指针:指向更新 新数组下标的位置
// 数组中快慢指针模板
int n = nums.size();
int fast = 0, slow = 0;
for (fast = 0; fast < n; ++fast) {
   
    if (nums[fast] != val) {
   	// 题目给的判断条件
        nums[slow++] = nums[fast];	// 不满足条件的情况进行替换,满足条件后又遇到不满足的情况依然如此替换
    }
}
return slow;

  快慢指针中,在没有满足条件前,使用 类似nums[slow++] = nums[fast];,而不能凭借想象说想把两个指针指向满足条件的数的情况下再来进行操作而使用 ++slow;++fast;,前者能保证在满足条件之后的数据不满足条件的情况下,仍然能将 fast 指向的元素替换到 slow 指向的元素,而后者却不能。


二、练习题目

  1. 27. 移除元素
  2. 26. 删除有序数组中的重复项
  3. 283. 移动零
  4. 844. 比较含退格的字符串
  5. 977. 有序数组的平方

三、源码剖析

1、27. 移除元素|★★★☆☆(第一题,看了题解)

第一版:快慢指针(题解)

时间复杂度:O(n),空间复杂度:O(1)

class Solution {
   
public:
    int removeElement(vector<int>& nums, int val) {
   
        // 双指针,快慢指针
        // 快慢指针的要点是,弄清楚快指针和慢指针的职责
        int n = nums.size();
        int fast = 0, slow = 0;
        for (fast = 0; fast < n; ++fast) {
   
            if (nums[fast] != val) {
   
                nums[slow++] = nums[fast];
            }
        }
        return slow;
    }
};

第二版:相向双指针(题解)

时间复杂度:O(n),空间复杂度:O(1)

class Solution {
   
public:
    int removeElement(vector<int>& nums, int val) {
   
        // 相向双指针
        // 基于题目说元素的顺序可以改变,因此可以前后一个指针,前面的指针找到等于val的地方,后面的指针找到不等于val的地方,然后用后面的覆盖前面的
        int l = 0, r = nums.size() - 1;
        while (l <= r) {
   
            // 前面找到等于val的地方
            while (l <= r && nums[l] != val) {
   
                ++l;
            }
            // 后面找到不等于val的地方
            while (l <= r && nums[r] == val) {
   
                --r;
            }
            if (l < r) {
   
                nums[l++] = num
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值