leetcode 数组 27.移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。

返回 k。

不能直接删除,数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖

暴力解法,复杂度O(n2):

两层for循环,一个for循环遍历数组元素 ,第二个for循环更新数组

cpp 复制代码
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int size = nums.size();
        for (int i = 0; i < size; i++) {
            if (nums[i] == val) { // 发现需要移除的元素,就将数组集体向前移动一位
                for (int j = i + 1; j < size; j++) {
                    nums[j - 1] = nums[j];
                }
                i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
                size--; // 此时数组的大小-1
            }
        }
        return size;

    }
};

下面我一开始的代码,不规范直接超时,即便是上面的也有超时不通过风险:

class Solution {

public:

int removeElement(vector& nums, int val) {

int count=0;

for(int i=0;i<nums.size();i++){

if(numsi==val){

for(int j=i;j<nums.size();j++){

numsj=nums++j;

i--;

count++;

}

}

}return count;

}

};

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

快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组

慢指针:指向更新 新数组下标的位置

cpp 复制代码
快慢指针,满指针便是新数组,快指针先走判断,直接把与val不同的覆盖前面的

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
            if (val != nums[fastIndex]) {
                nums[slowIndex++] = nums[fastIndex];
            }
        }
        return slowIndex;
    }
};

时间复杂度:O(n)

双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法

相关推荐
骑着蜗牛撵大象3275 小时前
告别内存泄漏:LLMManager架构设计与智能指针在AI SDK中的智慧选型
c++·ai·架构
Navigator_Z6 小时前
LeetCode //C - 1254. Number of Closed Islands
c语言·算法·leetcode
deepseek236 小时前
GPT-6 Astra 破解 FrontierMath 九年悬案拆解:调和熵投票规则反证核恒非空,局部搜索如何终结反例悬赏
人工智能·算法·ai agent
汉克老师6 小时前
CSP-J 2026 初赛试题解析(第二部分:阅读程序题(第一题))精讲
c++·csp-j·小学生·学c++编程
syagain_zsx6 小时前
算法基础篇 · 04 前缀和(C++ 题解)
c++·算法·前缀和
汉克老师7 小时前
CSP-J 2026 初赛试题解析(第三部分:完善程序题(第一题))精讲
c++·csp-j·小学生·学c++编程
青山是哪个青山7 小时前
LeetCode 123:买卖股票的最佳时机 III
算法
haluhalu.8 小时前
初识 Protobuf:微服务跨语言通信的一份契约
java·c语言·开发语言·c++·python
Zane19948 小时前
写对二分查找有多难?Java集合框架的作者也曾栽在一行mid计算上
算法
Lokey8688 小时前
transformer结构
算法