• LeetCode每日一练 —— 27. 移除元素


    🌟 前言

    Wassup guys!我是Edison 😎

    今天是 LeetCode 上的 leetcode 27. 移除元素

    Let’s get it!

    在这里插入图片描述



    1. 题目分析

    数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
     
    不要使用额外的数组空间,你必须仅使用 O ( 1 ) O(1) O(1) 额外空间并 原地 修改输入数组
     
    元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

    示例 1:
    在这里插入图片描述

    示例 2:
    在这里插入图片描述

    2. 题目图解

    🍑 思路一

    开辟一个和 nums 大小一样的新数组,把不是 val 的值拷贝到新数组

    首先指针 src 指向 nums 数组中的起始位置;指针 dst 指向 newNums 数组中的起始位置👇
    在这里插入图片描述

    此时,src指向的元素为 0,不是 2,那么就把数字 0 放到 newNums 数组中,指针 srcdst 同时向后挪动,如图所示👇
    在这里插入图片描述

    此时,src指向的元素为 1,不是 2,那么就把数字 1 放到 newNums 数组中,指针 srcdst 同时向后挪动,如图所示👇
    在这里插入图片描述

    此时,src指向的元素为 2,与 val 的值相等,那么就把指针 src 向后挪动,指针 dst 不动,如图所示👇
    在这里插入图片描述

    此时,src指向的元素为 2,与 val 的值相等,那么就把指针 src 向后挪动,指针 dst 不动,如图所示👇
    在这里插入图片描述

    此时,src指向的元素为 3,不是 2,那么就把数字 3 放到 newNums 数组中,指针 srcdst 同时向后挪动,如图所示👇
    在这里插入图片描述

    此时,src指向的元素为 0,不是 2,那么就把数字 0 放到 newNums 数组中,指针 srcdst 同时向后挪动,如图所示👇
    在这里插入图片描述

    此时,src指向的元素为 4,不是 2,那么就把数字 4 放到 newNums 数组中,指针 srcdst 同时向后挪动,如图所示👇
    在这里插入图片描述
    此时,src已经指向了最后一个元素为 2,与 val 的值相等,那么就结束循环,如图所示👇

    此方法的时间复杂度为 O ( n ) O(n) O(n),空间复杂度也是 O ( n ) O(n) O(n);不符合题意

    🍑 思路二

    此方法是思路一的升级,不开辟新数组,直接在原数组使用双指针

    指针 srcdst 同时指向 nums 的起始位置,如图所示👇在这里插入图片描述

    此时 src 指向的元素为 0,不等于 val(2),那么就用 src 指向的元素去 覆盖dst 指向的元素,然后 srcdst 同时向后挪动,如图所示👇
    在这里插入图片描述

    此时 src 指向的元素为 1,不等于 val(2),那么就用 src 指向的元素去 覆盖dst 指向的元素,然后 srcdst 同时向后挪动,如图所示👇
    在这里插入图片描述

    此时 src 指向的元素为 2,等于 val(2),那么就只把指针 src 向后挪动,指针 dst 不动,如图所示👇
    在这里插入图片描述

    此时 src 指向的元素还是 2,等于 val(2),依旧只把指针 src 向后挪动,指针 dst 不动,如图所示👇
    在这里插入图片描述

    此时 src 指向的元素为 3,不等于 val(2),那么就用 src 指向的元素去 覆盖dst 指向的元素,然后 srcdst 同时向后挪动,如图所示👇
    在这里插入图片描述

    此时 src 指向的元素为 0,不等于 val(2),那么就用 src 指向的元素去 覆盖dst 指向的元素,然后 srcdst 同时向后挪动,如图所示👇
    在这里插入图片描述

    此时 src 指向的元素为 4,不等于 val(2),那么就用 src 指向的元素去 覆盖dst 指向的元素,然后 srcdst 同时向后挪动,如图所示👇
    在这里插入图片描述

    此时 src 指向最后一个元素 2,等于 val(2),那么直接结束,返回 dst 的长度
    在这里插入图片描述

    所以 dst 就是用来删除数组中等于 val 的值,然后把不等于 val 的值依次往后放!所以这道题的结构如下👇
    在这里插入图片描述

    3. 代码实现

    📝 接口代码

    int removeElement(int* nums, int numsSize, int val){
        int src = 0;
        int dst = 0;
        int i = 0;
        while (src < numsSize) {
            if (nums[src] != val) {
                nums[dst] = nums[src];
                src++;
                dst++;
            }
            else {
                src++;
            }
        }
        return dst;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    🌟 提交结果
    在这里插入图片描述

  • 相关阅读:
    Traditional Feature-based Method-Node
    四川汇聚荣聚荣科技有限公司在市场评价好吗?
    Mysql 性能分析(慢日志、profiling、explain)、读写分离(主从架构)、分库分表(垂直分库、垂直分表、水平分表)
    ArcGIS影像TIF拼接
    C++入门 第二篇( 引用、内联函数、auto关键字、指针空值nullptr)
    网络:VRP介绍
    低空经济持续发热,无人机培训考证就业市场及前景剖析
    PTA 7-92 简化的插入排序
    vue+js登陆页面, 前端实现滑块验证
    绝活!十年高工带你详解Spring Cloud 架构
  • 原文地址:https://blog.csdn.net/m0_63325890/article/details/125882348