首页 > 其他分享 >LeetCode27. 移除元素

LeetCode27. 移除元素

时间:2023-10-13 09:05:10浏览次数:37  
标签:val nums int 元素 fastIndex 移除 LeetCode27

描述

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

示例1

  • 输入:nums = [3,2,2,3], val = 3
  • 输出:2, nums = [2,2]
  • 解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

示例2

  • 输入:nums = [0,1,2,2,3,0,4,2], val = 2
  • 输出:5, nums = [0,1,4,0,3]
  • 解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

第一次提交的代码

class Solution {
    public int removeElement(int[] nums, int val) {
        int countOfValue=0;
        for(int i =0;i<nums.length;i++){
            if(nums[i]==val){
                countOfValue++;
                continue;
            }else{
                nums[i-countOfValue]=nums[i];
            }
        }
        return nums.length-countOfValue;
    }
}

结果

学习到的东西

自己的代码都是以前考研的时候记着的,并不知道它具体的分类或者名字是啥
看了别人的讲解才知道自己的方法本质就是快慢指针

以下为笔记,所记录的两种都是双指针法

  1. 快慢指针
    一个slowIndex一个fastIndex,其中slowIndex指向不等于target的index,而fastIndex无限指向下一个元素
// 时间复杂度:O(n)
// 空间复杂度:O(1)
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;
    }
};
  1. 双向指针
    leftIndex从左向右查找等于target的index停下来,rightIndex从右向左查找不等于target的索引,然后将rightIndex的值赋值给leftIndex的值
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int leftIndex = 0;
        int rightIndex = nums.size() - 1;
        while (leftIndex <= rightIndex) {
            // 找左边等于val的元素
            while (leftIndex <= rightIndex && nums[leftIndex] != val){
                ++leftIndex;
            }
            // 找右边不等于val的元素
            while (leftIndex <= rightIndex && nums[rightIndex] == val) {
                -- rightIndex;
            }
            // 将右边不等于val的元素覆盖左边等于val的元素
            if (leftIndex < rightIndex) {
                nums[leftIndex++] = nums[rightIndex--];
            }
        }
        return leftIndex;   // leftIndex一定指向了最终数组末尾的下一个元素
    }
};

经过验证,第一种方法使用的内存相对于本人的方法占用的内存较多一些,因为需要对每个索引对应的值进行覆盖,操作多了一些
所以移除元素方法保留个人的方法不做修改
但是第二种是我没见过的方法,帅!

标签:val,nums,int,元素,fastIndex,移除,LeetCode27
From: https://www.cnblogs.com/whitePuPigeon/p/17761049.html

相关文章

  • 笨办法学Python3 习题34 访问列表的元素
    基数位置0代表 序数第一X=["a","b","c"]X[0]和X[-0] 代表X列表里的第一个数X[:]  #代表全部的列表内容X[0:1] //['a']  //位置0至位置1之前的元素X[0:2] //["a","b"] //位置0至位置2之前的元素X[-1]  //代表倒数第一个的元素hello="hellowor......
  • z-index 点击 不生效 遮挡 如何让被遮挡的下层元素能被点击到(且上层也能) 上层下层都能
    https://stackoverflow.com/questions/64052019/make-element-with-smaller-z-index-clickable一种方案是在上层元素的点击事件调用的函数中,通过js代码,选择器选中下层元素,然后.click()代码触发下层元素的点击事件 (如果上层不需要被点击,可以用pointer-events:none;)......
  • vue中v-bind绑定元素属性
    vue中v-bind绑定元素属性<html>  <head>  <metacharset="UTF-8">  <metaname="viewport"content="width=device-width,initial-scale=1.0">  <title>vue.js</title>  </head>  <b......
  • 如何水平居中一个元素?
    内容来自DOChttps://q.houxu6.top/?s=如何水平居中一个元素?如何使用CSS在另一个<div>内水平居中一个<div>?<divid="outer"><divid="inner">Foofoo</div></div>可以使用以下CSS样式实现:#outer{display:flex;justify-content:center......
  • Linq取单一元素
    LINQ通常查询到的结果是IEnumerable<T>集合类型,想要从中取出单一的元素,能使用Single、First、Last、ElementAt等方法,以及它们带有OrDefault的形式。Single返回序列中的惟一元素,First、Last返回第一個、最後一個元素。对比:方法序列为null序列不包含任何元素序列只包含一个......
  • css伪类和伪元素
    一、伪类说明  定义:伪类⽤于向某些选择器添加特殊的效果  超链接(a标签)伪类:a标签我们在日常工作和学习中用的很多,我们只知道默认状态下为蓝色,但是a标签其实有四种状态。    1、未访问前为蓝色(如果a标签使用不是蓝色而是紫色,那么近期访问过该网站,需要去浏览器删除近期记......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
    704.二分查找链接:https://leetcode.cn/problems/binary-search/description/思路:关键是定义清楚区间边界,想清楚middle在计算中是否可能取到左边界or右边界。若采用闭区间,则middle可能等于左/右边界值。27.移除元素链接:https://leetcode.cn/problems/remove-element/思路:暴......
  • 代码随想录算法训练营第一天(python) | 704. 二分查找、27. 移除元素。
    Leetcode704二分查找题目链接:704二分查找关键点思路:1、是否要进入到while部分的代码是left<=right还是left<right,看[left,right]是否是合法区间.例如[1,1]是合法区间,取<=;[1,1)非合法区间,取<。2、缩小区间时,考虑边界是否已经比较过。左闭右闭区......
  • python列表中的元素按照自身某个索引的元素排序
    title:aliases:-python列表按元素排序tags:-Python/数据处理category:stars:url:creation-time:2023-07-3115:26modification-time:#!/usr/bin/python#-*-coding:UTF-8-*-#获取列表的第二个元素deftakeSecond(elem):returnelem[1]#列表r......
  • 父元素flex:1 子元素height:100%
    <style>.box{display:flex;flex-direction:column;overflow:hidden;//只要不是auto}.parent{flex:1;min-height:0;//orheight:0}.children{......