【Leetcode每日一题】27. 原地移除元素|神级理解双指针

news/2025/1/16 3:44:34/

在这里插入图片描述

  • 博主简介:努力学习的预备程序媛一枚~
  • 博主主页: @是瑶瑶子啦
  • 所属专栏: LeetCode每日一题–进击大厂

在这里插入图片描述

目录

  • 题目描述
  • 题目分析:
  • 代码实现
  • 补充训练--验证
    • 代码实现

题目描述

链接: 27. 移除元素

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

Given an integer array nums and an integer val, remove all occurrences of val in nums in-place. The relative order of the elements may be changed.
Since it is impossible to change the length of the array in some languages, you must instead have the result be placed in the first part of the array nums. More formally, if there are k elements after removing the duplicates, then the first k elements of nums should hold the final result. It does not matter what you leave beyond the first k elements.
Return k after placing the final result in the first k slots of nums.
Do not allocate extra space for another array. You must do this by modifying the input array in-place with O(1) extra memory.

题目分析:

  • 题型:一维数组原地移除元素
  • 关键:双指针法
    • 【指针1号】:从数组头开始遍历,查找
    • 【指针2号】:从数组头开始,控制数组不出现target。
      这个指针坚持被叫作慢指针,是因为走的慢(但是关键是理解好它的作用是什么!)
  • "奇葩"理解~

不得不说,这种理解真的很奇葩,但是真的很形象!!!是我偶然一次在blink上看到的,虽然现在找不到那位同学了,如果你能看见,在这里给你表示感谢!我下面用图画和语言的形式来展现一下!

在这里插入图片描述

对应关系

  • 一串排列有序的萝卜坑&萝卜→数组&数组元素
  • 橙色萝卜→“新”数组元素,即不被移除元素
  • 红色萝卜→需被移除元素
  • 夫妻二人→双指针
    • 女生:快指针
    • 男生:慢指针

过程解析

 女生负责从一厢萝卜菜地的这头视察到那头for (int fastIndex = 0; fastIndex < nums.length; fastIndex++)
 男生负责挖坑nums[slowIndex++]
 如果遇到了橙色萝卜,女生会告诉男生:“把这个萝卜填到你挖的坑里面去,并且继续挖下个坑,可能还有橙色萝卜需要填”nums[slowIndex++] = nums[fastIndex]
遇到了红色萝卜,她什么也不说,直接跳过去,寻找下一个橙色萝卜if (nums[fastIndex] == val) { continue;//快指针遇到目标元素,即跳过 }
  如此进行下去,直到一厢菜地被视察完。
在这里插入图片描述

代码实现

class Solution {public int removeElement(int[] nums, int val) {int slowIndex = 0;for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {if (nums[fastIndex] == val) {continue;//快指针遇到目标元素,即跳过}nums[slowIndex++] = nums[fastIndex];//满指针指向正确元素的正确位置}return slowIndex;}
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

补充训练–验证

如果你还是对上面的理解将信将疑,不如看看下面这题,验证以上理解确实有用

26. 删除有序数组中的重复项
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

代码实现

class Solution {public int removeDuplicates(int[] nums) {int slowIndex = 0;for (int quickIndex = 0; quickIndex < nums.length; quickIndex++) {//如果在遍历时发现此元素和前面重复,直接跳过此元素if (quickIndex > 0 && nums[quickIndex] == nums[quickIndex - 1]) {continue;}//慢指针在后面“挖坑”等着接收nums[slowIndex++] = nums[quickIndex];}return slowIndex;}
}

write in the end:
后续还会更新很多双指针题目来加深对双指针的理解!还不快快关注![笔芯]

  • 专栏系列文章:
    【Leetcode每日一题】69. x 的平方根/Sqrt(x)|二分查找
    【Leetcode每日一题】34.在排序数组中查找元素的第一个和最后一 个位置|二分求下标
    【Leetcode每日一题】35.搜素插入位置|二分查找数组下标
  • 建立此专栏的初衷是为了监督自己每天认真刷一个题,积少成多。并把自己每次刷题的思路、收获以博文的形式分享出来,帮助更多人,以及方便后续复习。如果有兴趣的同学可以订阅此专栏,我们一起刷题,一起交流,进步和学习!专栏:LeetCode每日一题–进击大厂

在这里插入图片描述


http://www.ppmy.cn/news/20257.html

相关文章

Kettle(16):Kitchen作业执行引擎

在Linux中对Kettle做Linux配置(和Windows相同,添加驱动jar包) 上传以后需要重启。 1 在Windows中开发作业 2 配置Start组件 3 配置转换组件 修改Kettle&

go mod更新指定的tag的包后,go vendor内容未更新

背景 golang项目使用module进行依赖及版本管理&#xff0c;私有项目或二次开发的项目通过vendor进行管理。 在一次修改代码&#xff0c;打完tag&#xff0c;修改项目go.mod中依赖私有仓库的tagv6.0.12后&#xff0c;使用go mod tidy 更新依赖&#xff0c;go.sum中的对应仓库的…

最快的树视图组件:Flexible TreeView.NET Crack

为什么要使用灵活的 TreeView&#xff1f; 灵活性 市场上其他类似树视图的组件所不具备的无与伦比的可扩展性和独特功能。 表现 市场上最快的树视图组件。 仅需 0.39 秒即可添加 100,000 个节点。 简单 尽管是一个非常强大的树视图组件&#xff0c;但 Flexible TreeView 被设计…

Python中的文件对象

文件对象的seek()和tell()打开一个文件&#xff0c;读取内容&#xff0c;是很常见的操作。不过有的时候我们还需要反复读取文件中的内容&#xff0c;如果多次打开文件读取再多次关闭&#xff0c;显然不是特别好的操作&#xff0c;我们可以借助Python文件对象的seek()和tell()函…

day24|491.递增子序列、46.全排列、47.全排列 II

491.递增子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作递增序列的一种特殊情况…

JavaScript break 和 continue 语句

JavaScript 中的 break 和 continue 语句是常用的循环控制语句&#xff0c;它们可以帮助我们更灵活地控制循环的执行流程。 break 语句可以在循环体内部使用&#xff0c;用于终止循环。当遇到 break 语句时&#xff0c;循环会立即终止&#xff0c;并跳出循环体。下面是一个简单…

Python爬虫之Scrapy框架系列(7)——XXTop250电影简介信息的获取及存储到本地

前面简单爬取了某Top250电影的一些信息。本文&#xff0c;来尝试搞到每个电影的简介信息。 目录&#xff1a;1. 获取电影简介信息1.1 第一步&#xff1a;配对每个电影对应的简介信息&#xff1a;First&#xff1a;包含电影简介信息url的获取Second&#xff1a;爬虫文件的更改Th…

SpringCloud入门实战(五)-集成Ribbon

一、Ribbon简介 Spring Cloud Ribbon是Netflix发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时&#xff0c;重试等。简单地说&#xff0c;就是在配置文件中列出Load Balancer(简称LB)后面所有…