lrange是取出所有值并移除么_图解双指针 | LeetCode 27. 移除元素

de5d3b257d69da88524d37a461ee5c4b.png

题目描述

原题链接:LeetCode 27. 移除元素

给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1:

给定 nums = [3,2,2,3], val = 3,函数应该返回新的长度 2, 并且 nums 的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。

示例 2:

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

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {print(nums[i]);
}

题意解读

划一下题目的重点:

  • 原地移除
  • 不要使用额外的数组空间
  • 不需要考虑数组中超出新长度后面的元素

题目要求我们原地删除所有等于 val 的元素,不能使用额外空间,且不用考虑删除后超出新数组长度后面的元素

也就是说,如果原数组 nums 长度为 x,要删除的 val 元素个数为 y,那么我们只要把这 n 个要删除的元素所在位置用其他有效元素覆盖掉,然后返回最终的数组长度 x - y

题目并非让我们真的删除数组的元素,而是要改写相关元素的值。

思路阐述

那么要如何进行元素的改写呢?

既然要让 val 元素都堆在数组尾部,那么我们就派出一个开拓者探路,只要遇到非 val 元素,就把它覆盖到前面来

因此,我们可以定义两个指针:

  • 快指针 j:用于寻找非 val 元素
  • 慢指针 i:当 j 找到非 val 元素时,就被非 val 元素覆盖

图解思路

以题中的 nums = [3,2,2,3], val = 3 为例。

开始时 ij 都指向下标 0 位置:

018d03275440c16424f122e44abf1c06.png

此时 j 指向的元素为 val,所以把 j 右移动 1 位:

5c9d858542be24537cc929ffa3aefd13.png

此时,开拓者 j 找到了一个非 val 元素,那么就赋值给 i 吧:

67943a9006bd3451e912a50477369732.png

赋值以后,我们得到了一个新的序列 [2, 2, 2, 3],我们可以得知:

  • i 指向的元素一定不是 val,因为它是从 j 指向的元素赋值得来的,j 指向非 val 元素才会进行赋值
  • j 指向的元素一定不是非 val???

这样一来,ij 都完成了本轮使命,继续前进!

因此每次交换以后,我们都同步增长双指针,令 i = i + 1j = j + 1

3d00fd95e825d4232a5ec6c73420bb89.png

此时 j 又指向了一个非 val 元素,继续赋值:

e9384ba99b33b7acf3b6ca6ba16ba529.png

因为本次 ij 指向元素相同,所以赋值后序列没有改变。赋值操作后,我们继续同步增长双指针:

2680b1d9333661a2bb728c61e15c5049.png

此时 j 指向了一个 val 元素,无法进行赋值操作,继续增长 j,令 j = j + 1

7da275d815cda8a6bc35185bb41c71cd.png

此时我们发现 j 超出数组范围了,循环结束。[2, 2, 2, 3] 即为我们最终所求结果,而红色部分即为新数组长度,长度为 len(nums) - (j - i)

总结一下

设置双指针 ij,其中,j 用于寻找非 val 元素,来覆盖 i 所指向的元素。

  • 初始时:设 i = 0, j = 0
  • 遍历数组:
    • 若 `nums[j] != val`:
      • 把 `j` 的值赋给 `i`:`nums[i] = nums[j]`
      • 同步增长双指针:`i = i + 1, j = j + 1`
    • 若 `nums[j] == val`:
      • `j` 变为快指针:`j = j + 1`,寻找下一个非 `val` 元素

具体实现

Python

class Solution:def removeElement(self, nums, val):""":type nums: List[int]:type val: int:rtype: int"""length = len(nums)i = 0j = 0while j < length:if nums[j] != val:nums[i] = nums[j]i = i + 1j = j + 1else:j = j + 1res = length - (j - i)return res

Golang

func removeElement(nums []int, val int) int {length := len(nums)if length == 0 {return 0}i := 0j := 0for j < length {if nums[j] == val {// 去找一个不是 val 的值j++} else {// 赋值nums[i] = nums[j]i++ j++}}return length - (j - i)
}

复杂度

  • 时间复杂度:O(n)
  • 空间复杂度:O(1),没有使用到额外空间。

  • 我的题解项目: https://github.com/JalanJiang/leetcode-notebook
  • 如果你对做题和分享题解感兴趣,欢迎加入 LeetCode 刷题小分队:https://github.com/leetcode-notebook/leetcode-notebook.github.io/blob/master/README.md
  • 如果你觉得文章写得不错,欢迎关注公众号「编程拯救世界」,公众号专注于编程基础与服务端研发,定期分享算法与数据结构干货~

3daca5d23c703e58f71fa8dd30d72ea2.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机辅助工程分析及应用论文,计算机辅助工程计量的论文

【摘要】随着科学技术的不断进步&#xff0c;计算机辅助工程计量的技术也日趋成熟并得到广泛应用。下面就广联达图形算量作以简要概述。【关键词】计算机、辅助、工程计量一、gcl7.0图形算量软件应用综述广联达图形算量软件gcl7.0是专为在目前传统定额模式向清单模式过渡时期量…

Effective前端5:减少前端代码耦合

什么是代码耦合&#xff1f;代码耦合的表现是改了一点毛发而牵动了全身&#xff0c;或者是想要改点东西&#xff0c;需要在一堆代码里面找半天。由于前端需要组织js/css/html&#xff0c;耦合的问题可能会更加明显&#xff0c;下面按照耦合的情况分别说明&#xff1a; 1. 避免全…

戴尔笔记本电脑的计算机配置在哪,戴尔电脑的便签在哪里?笔记本电脑怎么设置便签?...

戴尔电脑是国内一些用户所使用的电脑品牌。如果戴尔电脑安装的是Windows系统&#xff0c;是可以在电脑附件中找到系统自带的便笺或者Sticky Notes工具的&#xff0c;可以粘贴在电脑桌面上记录简单的文字内容&#xff0c;但并不支持设置待办提醒事项。除了系统自带便笺之外&…

12帧跑步动画分解图_画出人物跑步的动画运动规律,并上传动画效果视频和逐帧图片。...

【判断题】在竞争激烈的市场环境中,职业生的就业优势是证书【简答题】请把今天的语文作业拍照、语音上传,谢谢!【简答题】请把今天的语文作业拍照上传,今日古诗语音上传,谢谢!【简答题】请把今天的作业拍照、语音上传,谢谢!【判断题】职业纵向发展只体现在技术和职务提升。【判…

VMWare MAC系统调整磁盘

VMware&#xff0c;打开虚拟文件&#xff0c;调整磁盘大小。 从40G调整到80G 进入虚拟机&#xff0c;打开终端 diskutil list;diskutil resizeVolume disk0s2 80GB http://blog.csdn.net/binyao02123202/article/details/51629288转载于:https://www.cnblogs.com/cb168/p/62096…

约翰诺曼超级计算机研究中心,第433章 拉泽尔松教授的决定_学霸的黑科技系统_晨星LL作品_du00...

就在陆舟与格林教授达成共识的时候&#xff0c;他在普林斯顿高等研究院的办公室外面&#xff0c;正晃悠着一个奇怪的人影。似乎是犹豫了一会儿&#xff0c;那人敲开门&#xff0c;走进了办公室。“请问这里是陆舟教授的办公室吗&#xff1f;”停下手中的笔&#xff0c;薇拉开口…

java并发编程(十七)内存操作总结

转载请注明出处&#xff1a;http://blog.csdn.net/ns_code/article/details/17377197 主内存与工作内存 Java内存模型的主要目标是定义程序中各个变量的访问规则&#xff0c;即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量主要是指共享变量&#x…

柔性体没有应变_边坡防护终结篇!柔性防护系统(主被动网)知识总结!

筑龙岩土20万岩土人在这里关注来源&#xff1a;北京科技大学课件版权归原作者所有有粉丝一定发现我们推送的几篇关于边坡防护与加固的文章&#xff0c;均整理自北京科技大学的课件。没有注意到的可以回顾一下下面的系列文章&#xff0c;今天还剩最后一小点&#xff0c;落石防护…

计算机原理中的cps,信息物理融合系统(CPS)原理

信息物理融合系统(CPS)原理语音编辑锁定讨论上传视频《信息物理融合系统(CPS)原理》是2017年机械工业出版社出版的图书&#xff0c;作者是[美] &#xfffd;拉吉夫阿卢尔&#xff0c;董云卫翻译。[1]书 名信息物理融合系统(CPS)原理作 者[美] &#xfffd;拉吉夫阿卢尔译…

十六周个人作业

计划估计此程序需要3-5天。 开发需求分析用户故事&#xff1a;作为一个观众&#xff0c;我希望了解某一场比赛的比分&#xff0c;以便了解赛况。&#xff08;满意条件&#xff1a;精确到每一局的结果比分&#xff09;。 从分析用例故事可以知道完成此程序需要这两项任务&#x…

新型计算机作文1000,人类:感性的计算机作文1000字

库克似乎并不担心人工智能研究者所说的“奇点”之到来。对于创造新物种的企愿毕竟是刻入基因序列中的&#xff0c;潘多拉魔盒迟早会开&#xff0c;而经由人类这并不完美的造物之手诞生的、可机会趋近完美的人工智能&#xff0c;是否会超越人的思维极限&#xff0c;或拥有与人相…

迁徙图_虾米音乐上的原住民会迁徙去哪呢?

一石激起千层浪。最近&#xff0c;认证为「前华纳音乐/环球音乐中国区市场总监」的相征(今年因《乐队的夏天》走红)发微博称&#xff1a;江湖传闻&#xff0c;虾米音乐明年1月份关闭&#xff0c;一个时代要结束了吗&#xff1f;时代是没那么容易结束的。只不过&#xff0c;每一…

个人作业

.计划 3天 .开发 .需求分析 用户故事&#xff1a;作为一个观众&#xff0c;我希望了解某一场比赛的比分&#xff0c;以便了解赛况。&#xff08;满意条件&#xff1a;精确到每一局的比分&#xff09;。 任务&#xff1a; 观众可以选择查看每局的比分&#xff0c;也可以查看每一…

xp做打印服务器 找不到驱动,XP系统安装打印机驱动提示找不到指定的模块怎么办...

‍‍今天一位用户反馈说XP系统安装打印机驱动提示“找不到指定的模块”&#xff0c;导致打印机驱动没办法正常使用&#xff0c;怎么办呢&#xff1f;如果已经安装过打印机驱动失败&#xff0c;可以先卸载&#xff0c;在重启电脑。接下去教程和大家分享XP系统安装打印机驱动提示…

python 回车键_python tkinter 绑定回车键

# _*_ coding:utf-8_*_from Tkinter import *def submit(ev None):p.set(u.get())root Tk()root.title("测试")frame Frame(root)frame.pack(padx8, pady8, ipadx4)lab1 Label(frame, text"获取:")lab1.grid(row0, column0, padx5, pady5, stickyW)#绑…

判断点在多边形内部

项目的需要&#xff0c;需要判断点在多边形的内部&#xff0c;是整个算法必要的步骤&#xff0c;查了一些资料&#xff0c;中文很少&#xff0c;英文资料已经介绍的很清楚了&#xff0c;这里只是总结一下。 问题的完整描述是判断平面上一点在多边形的内部、外部或者边界上。 有…

js文件里获取路由 vue_【源码拾遗】从vue-router看前端路由的两种实现

本文由浅入深观摩vue-router源码是如何通过hash与History interface两种方式实现前端路由&#xff0c;介绍了相关原理&#xff0c;并对比了两种方式的优缺点与注意事项。最后分析了如何实现可以直接从文件系统加载而不借助后端服务器的Vue单页应用。随着前端应用的业务功能越来…

龙武2服务器在维护,龙武5.25更新维护时间_龙武5.5更新维护详情_牛游戏网

龙武5.25日更新维护公告&#xff0c;相信小伙伴们也很关心更新内容&#xff0c;那么&#xff0c;让我们一起看看这次更新的内容吧&#xff01;尊敬的广大玩家朋友&#xff1a;为保证玩家顺畅进行游戏&#xff0c;提高整体服务质量&#xff0c;给玩家提供更好的服务&#xff0c;…

[bzoj1036][ZJOI2008]树的统计Count

Description 一棵树上有$n$个节点,编号分别为$1$到$n$,每个节点都有一个权值$w_i$. 有三种操作: $1.CHANGE\;u\;t$:把结点$u$的权值改为$t$; $2.QMAX\;u\;v$:询问从点$u$到点$v$的路径上的节点的最大权值; $3.QSUM\;u\;v$:询问从点$u$到点$v$的路径上的节点的权值和. $P.S.$ 从…

祁飞机器人_转自祈飞:什么是智能机器人

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼智能机器人新型驱动器智能机器人除了传统的电动机驱动、液压驱动、气压驱动等方式外&#xff0c;由于结构及尺寸的不同&#xff0c;还常采用如下一些新型的驱动器。静电驱动形状记忆合金驱动压电驱动及磁致伸缩驱动。1、静电驱动器…