当前位置:首页 > 力扣 > 力扣27题最优解:巧用左右指针,3分钟攻克原地操作

力扣27题最优解:巧用左右指针,3分钟攻克原地操作

2周前 (05-13)

题目要求从整数数组中原地移除所有等于给定值 val 的元素,并返回新的数组长度。最终数组的前 n 个位置应为非 val 的元素,且元素的顺序可以改变。例如,输入 nums = [3,2,2,3], val = 3,移除后数组前 2 个元素为 [2,2],返回长度 2。需要注意两个要求:原地修改数组和使用空间复杂度为 O(1) 的算法

力扣27题最优解:巧用左右指针,3分钟攻克原地操作 双指针 力扣 数组 第1张

解题思路与过程

1‌.双指针技巧‌
使用左右两个指针(l 从左向右,r 从右向左)快速定位需要移除的元素。

2‌.交换与覆盖策略‌
当左指针 l 遇到 val 时,将其与右指针 r 指向的元素交换,并将右指针左移,跳过已被处理的元素。这意味着所有等于 val 的元素逐渐被“推”到数组末尾。

3‌.动态调整有效长度‌
每次交换后,数组的有效长度 n 减 1,确保后续循环不会处理末尾已被标记的元素。

‌4.终止条件‌
循环持续直到左指针 l 超过右指针 r,此时所有非 val 元素已集中在数组前 n 个位置。


代码:

class Solution {  
public:  
    int removeElement(vector<int>& nums, int val) {  
        int n = nums.size();          // 初始化有效长度为数组总长  
        int l = 0, r = n - 1;         // 左右指针分别指向数组首尾  
        while (l <= r) {              // 当左指针未越过右指针时循环  
            if (nums[l] == val) {     // 左指针遇到目标值  
                // 交换左指针和右指针的值,将目标值移到数组末尾  
                int tmp = nums[l];  
                nums[l] = nums[r];  
                nums[r] = tmp;  
                r--;                  // 右指针左移,缩小处理范围  
                n--;                  // 有效长度减1,排除末尾的val  
            } else {  
                l++;                  // 左指针右移,保留当前非val元素  
            }  
        }  
        return n;                     // 返回最终有效长度  
    }  
};


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣451:ASCII数组计数法 用128个桶解决频率排序问题

力扣451:ASCII数组计数法 用128个桶解决频率排序问题

题目重解给定一个字符串,将字符按照出现频率降序排列。例如输入"tree",可能返回"eetr"或"eert"。题目要求我们不考虑字母顺序,只...

力扣53题:贪心策略与动态规划的完美联姻 三行代码映射算法精髓

力扣53题:贪心策略与动态规划的完美联姻 三行代码映射算法精髓

题目理解在数字的海洋中寻找最具价值的珍珠链:当我们面对一个可能包含正负数的数组时,寻找连续子数组的和最大值就像在波动的股票曲线中捕捉最佳投资时段。问题的核心在于如何处理可能降低总和的负值元素——是忍痛...

力扣746:三步通关最小花费爬楼梯

力扣746:三步通关最小花费爬楼梯

题目解析:站在楼梯的某个台阶时,需要支付当前台阶对应的体力值cost[i],之后可以选择向上爬1或2个台阶。最终目标是到达‌楼层顶部‌(即数组末尾之后的位置),且初始位置可选择下标0或1的台阶作为起点...

力扣740.删除并获得点数 预处理与动态规划的巧妙融合

力扣740.删除并获得点数 预处理与动态规划的巧妙融合

题意解析:给定一组数字,每当你选择一个数字x时,所有等于x-1和x+1的数字都会被自动移除。你需要通过巧妙的选择顺序,最大化获得的点数总和。这个问题可以转化为对离散化数字分布的动态规划问题——将相邻数...

力扣第1991题:寻找数组的中心索引 如何找到左右和相等的中心索引

力扣第1991题:寻找数组的中心索引 如何找到左右和相等的中心索引

题目解读给定一个整数数组,我们需要找到一个中心索引,使得该索引左侧所有元素的和等于右侧所有元素的和。如果不存在这样的索引,则返回-1。中心索引的定义不包含在左右两侧的和计算中。这个问题考察对数组遍历和...

征服力扣704题:三步掌握经典二分查找算法

征服力扣704题:三步掌握经典二分查找算法

题目重解我们面对的是算法领域最经典的二分查找问题:在一个已排序的整数数组中,快速定位目标值的位置。就像在一本按字母顺序排列的字典中查找单词,我们不需要逐页翻阅,而是通过不断折半的方式快速缩小搜索范围,...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。