leetcode 面试经典 150 题:移除元素

链接 移除元素
题序号 27
类型 数组
解题方法 双指针
难度 简单

题目

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

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

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

  • 用户评测

    评测机将使用以下代码测试您的解决方案:

    int[] nums = [...]; // 输入数组

    int val = ...; // 要移除的值

    int[] expectedNums = [...]; // 长度正确的预期答案。 // 它以不等于 val 的值排序。

    int k = removeElement(nums, val); // 调用你的实现

    assert k == expectedNums.length; sort(nums, 0, k); // 排序 nums 的前 k 个元素

    for (int i = 0; i < actualLength; i++) {

    assert nums[i] == expectedNums[i];

    }

    如果所有的断言都通过,你的解决方案将会 通过。

  • 示例 1

    输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2,, ]

    解释:你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。 你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。

  • 示例 2

    输入:nums = [0,1,2,2,3,0,4,2], val = 2 输出:5, nums = [0,1,4,0,3,, ,_]

    解释:你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。 注意这五个元素可以任意顺序返回。 你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。

  • 提示

    0 <= nums.length <= 100

    0 <= nums[i] <= 50

    0 <= val <= 100

题解

双指针法

  1. 要点:一个指针 right 用于遍历数组,另一个指针 left 用于指向下一个不等于 val 的元素应该放置的位置。
  2. 时间复杂度:O(n);
  3. 空间复杂度:O(1);
  4. c++ 算法:
cpp 复制代码
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int n = nums.size();
        int left = 0;
        
        for (int right = 0; right < n; right++) {
            if (nums[right] != val) {
                nums[left] = nums[right];
                left++;
            }
        }

        nums.resize(left); //调整 nums 大小
        return left;
    }
};
  1. 演示:以示例1为例
bash 复制代码
推演:
nums = 3 2 2 3
val = 3

removeElement:
    n = nums.size = 4
    left = 0
    for right=0; right<4; right++
        if nums[0] != 3 //等于3,if不成立

    for right=1; right<4; right++
        if nums[1] != 3
            nums[0] = nums[1] = 2
            left++ 等于1
    for right=2; right<4; right++
        if nums[2] != 3 
            nums[1] = nums[2] = 2
            left++ 等于2
    for right=3; right<4; right++
        if nums[3] != 3 //等于3,if不成立
    for right=4; right<4; right++ //for循环不成立,退出

    nums.resize(left) //调整nums大小为left
    return left //返回 

c++ 完整demo

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>

using namespace std;

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

        nums.resize(left); //调整 nums 大小
        return left;
    }
};
int main(){

    vector<int> nums = {3, 2, 2, 3};
    int val = 3;

    Solution solution;

    int number = solution.removeElement(nums, val);

    assert(number == nums.size());

    cout << "number: " << number << endl;

    cout << "nums.size: " << nums.size() << endl;

    for(int i = 0; i< number; i++){
        cout << "i: " << i  << ", nums[" << i << "]: "<< nums[i] << endl;
    }


    return 0;
}
相关推荐
AredRabbit5 分钟前
vector<int> 的用法
c++·算法·vector
pilgrim5312 分钟前
【二刷代码随想录】双指针-数组相关题型、推荐习题
java·数据结构·算法·leetcode
好好学习^按时吃饭21 分钟前
P4551 最长异或路径
算法·深度优先·图论
爱补鱼的猫猫26 分钟前
模型压缩(量化、剪枝、蒸馏、低秩分解)
算法·机器学习·剪枝
用户31574760813536 分钟前
MCP的出现,是对Function Calling的“书同文、车同轨”吗?
人工智能·面试·mcp
代码骑士1 小时前
聚类(Clustering)基础知识3
算法·支持向量机·聚类
梦姐的编程日志1 小时前
从研究动机视角对无监督图像去雾论文的分类
图像处理·人工智能·深度学习·算法·计算机视觉
Y1nhl1 小时前
搜广推校招面经六十二
人工智能·pytorch·python·算法·机器学习·推荐算法·搜索算法
蓝白咖啡1 小时前
华为OD机试 - 王者荣耀匹配机制 - 回溯(Java 2024 D卷 200分)
java·python·算法·华为od·机试
郭源潮12 小时前
《八大排序算法》
数据结构·算法·排序算法·c