当前位置:首页 > 力扣 > 力扣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;                     // 返回最终有效长度  
    }  
};


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣1137题:动态规划解泰波那契数 高效求解第N项的秘密

力扣1137题:动态规划解泰波那契数 高效求解第N项的秘密

一:重新解读题目泰波那契数列是一个充满数学趣味的递推序列:从第3项开始,每个数均为前三个数的和(即Tₙ₊₃ = Tₙ + Tₙ₊₁ + Tₙ₊₂)。当给定整数n时,需要高效计算出第n项的值。面对此类递...

力扣94:递归之美 轻松掌握二叉树中序遍历

力扣94:递归之美 轻松掌握二叉树中序遍历

题目解读二叉树的中序遍历是一种基础且重要的树遍历方式,其遍历顺序为:先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。对于二叉搜索树,中序遍历的结果恰好是节点值的升序排列。给定一个二叉...

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

一、题目解读力扣3112题要求解决带时间限制的最短路径问题:给定一个有向图,节点具有消失时间,需计算从起点到各节点的最短路径,且路径总时间不能超过节点的消失时间。题目难点在于需在传统最短路径算法(如D...

【牛客157题】:反转链表指定区间(虚拟头节点解法)

【牛客157题】:反转链表指定区间(虚拟头节点解法)

一、题目解读牛客第157题要求反转链表中第m到n个节点(包含m和n)的区间,并保持其他节点顺序不变。例如,给定链表1→2→3→4→5,m=2,n=4,应返回1→4→3→2→5。题目重点在于处理边界条件...

LeetCode 2778题解:平方和的高效计算与因数遍历优化(C++实现)

LeetCode 2778题解:平方和的高效计算与因数遍历优化(C++实现)

一、题目解读LeetCode 2778题要求计算数组中下标为n的因数的元素的平方和。例如,若n=6,其因数为1、2、3、6,则需计算nums[0]、nums[1]、nums[2]、nums[5]的平方...

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

一、题目解读LeetCode 2523题要求在一个给定的整数区间 [left, right] 内,找到间隔最小的两个质数(即相邻质数的差值最小),并返回这对质数。若区间内不存在两个质数,则返回 [-1...

发表评论

访客

看不清,换一张

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