LeeCode 27 - daily04

本文深入探讨了LeetCode上的经典算法题目“移除元素”,通过双指针技巧原地移除数组中特定值,详细解释了解题思路及代码实现。

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

每临大事有静气,不信今时无古贤

1. 题目

27. 移除元素

给你一个数组 nums 和一个值 val,你需要 原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。

这道题与 LeeCode 26 - daily03同属于数组 类型的题目。且在解法上也存在相同之处。

本题笔者也采用 双指针套路

2. 解法

注意 原地,往往意味着:拷贝覆盖

2.1 过程讲解

示例:nums = [3,2,2,3] value = 3

  1. low = 0 ; fast = 0; 结果:nums = [3,2,2,3] ,low = 0; fast = 1;
  2. low = 0 ; fast = 1 ; 结果:nums = [2,2,2,3] , low = 1; fast = 2;
  3. low = 1 ; fast = 2 ; 结果: nums = [2,2,2,3],low = 2 ; fast = 3;
  4. low = 2; fast = 3; 结果:nums = [2,2,2,3], low =2 ; fast = 4;
  5. 条件结束,返回low = 2;

详细步骤:请参考这里

2.2 不堪代码
 public int removeElement(int[] nums, int val) {
 		// 处理边界条件
        if(nums == null || nums.length == 0) return 0;
		// 快慢指针
        int low = 0;
        // 需要特别强调的是,此处的快指针也是从0开始,WHY ?
        int fast = 0;

        while(fast < nums.length){
            if(val == nums[fast]){
            	// 1.只更新快指针
                fast ++;
            }else{
            	// 原地:拷贝覆盖
                nums[low] = nums[fast];
                // 2. 快慢指针同时进步
                low ++;
                fast ++;
            }
        }
        return low;
    }

3. 技巧

遇见此类型题,高手直接都采用快慢指针。但是吾等菜鸟,还是需要稍思片刻…

一般而言,慢指针大部分都是从起始位置开始的(数组自然是从下标为0);
But快指针的设置还是有些技巧的。大部分情况下,既然是快指针,那自然是比慢指针要快一些,但也需要视情况而定。

3.1 快指针的设置要谨慎

要考虑情况,设定快指针。

以此题来展开论述:快慢指针是同时起步的。Why ?
因为数组的第一个值可能等于给定的值value. nums = [2], value = 2

3.2 快慢指针的步调问题

当使用快慢指针套路轻车熟路时,会发现这个套路是有规律可循的。

  1. 往往是在一种情况下,只更新快指针
  2. 另一种情况下,快慢指针同时要求进步

大家可以仔细揣摩一下


另外,做算法题笔纸随手把代码的过程给走一遍,会有很大帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值