27. 移除元素

方法一:双指针

复制代码
int removeElement(int* nums, int numsSize, int val) {
    int low = 0; // 慢指针:标记新数组的有效存储位置
    for (int fast = 0; fast < numsSize; fast++) { // 快指针:遍历整个数组
        if (nums[fast] != val) { // 筛选出不等于val的有效元素
            nums[low] = nums[fast]; // 将有效元素存入慢指针位置
            low++; // 慢指针后移,准备存下一个有效元素
        }
    }
    return low; // 慢指针最终位置 = 有效元素个数
}
核心逻辑
  • 快指针 :遍历数组,负责 "找" 有效元素(≠val)。
  • 慢指针:负责 "存" 有效元素,标记新数组的边界。
  • 最终low即为新数组长度,数组前low个元素为有效结果

方法二:双指针优化

左右双指针法 的高效实现,核心是用右侧有效元素覆盖左侧待删除元素,减少不必要的赋值操作,完全满足题目 "原地移除" 的要求。

复制代码
int removeElement(int* nums, int numsSize, int val) {
    int left = 0, right = numsSize;  // 右指针初始为数组长度(而非最后一个索引)
    while (left < right) {
        if (nums[left] == val) {
            // 用右侧最后一个有效元素覆盖当前待删除元素
            nums[left] = nums[right - 1];
            right--;  // 右指针左移,缩小待处理区间
        } else {
            left++;  // 左指针右移,寻找下一个待删除元素
        }
    }
    return left;  // 左指针最终位置 = 有效元素个数
}
  1. 指针定义
    • left:从左向右遍历,寻找 等于val 的待删除元素。
    • right:从右向左收缩,标记待覆盖的有效元素 边界(初始为数组长度,right-1是最后一个元素索引)。
  2. 核心操作
    • nums[left] == val时,用nums[right-1]覆盖它,同时right--(相当于 "移除" 了一个待删除元素)。
    • nums[left] != val时,left++(当前元素有效,继续向后找)。
  3. 终止条件
    • left < right:当left == right时,左右指针相遇,所有待删除元素已被覆盖,循环结束。
  4. 返回值
    • left即为有效元素的个数 ,数组前left个元素为不等于val的结果。
相关推荐
TracyCoder1232 小时前
LeetCode Hot100(28/100)——104. 二叉树的最大深度
算法·leetcode
执着2592 小时前
力扣hot100 - 101、对称二叉树
数据结构·算法·leetcode
多恩Stone2 小时前
【3D-AICG 系列-1】Trellis v1 和 Trellis v2 的区别和改进
人工智能·pytorch·python·算法·3d·aigc
数智工坊2 小时前
【数据结构-栈、队列、数组】3.3栈在括号匹配-表达式求值上
java·开发语言·数据结构
mit6.8242 小时前
模运算|z函数 字符串匹配
算法
阿豪只会阿巴2 小时前
【吃饭香系列】二周目|代码随想录算法训练营第七天|454.四数相加II |383. 赎金信 |15. 三数之和 |18. 四数之和
算法
小O的算法实验室2 小时前
2025年COR SCI2区,考虑风场影响的无人机搜救覆盖路径规划精确界算法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
xqqxqxxq2 小时前
洛谷算法1-3 暴力枚举(NOIP经典真题解析)java(持续更新)
java·开发语言·算法
_OP_CHEN2 小时前
【算法基础篇】(五十五)卡特兰数封神之路:从括号匹配到二叉树构造,组合数学的万能钥匙!
算法·蓝桥杯·c/c++·组合数学·卡特兰数·算法竞赛·acm/icpc