【算法系列-数组】移除元素 (双指针)

【算法系列-数组】移除元素 (双指针)

文章目录

  • 【算法系列-数组】移除元素 (双指针)
    • 1. 算法分析🛸
    • 2. 删除有序数组中的重复性(LeetCode 26)
      • 2.1 解题思路🎯
      • 2.2 解题过程🎬
      • 2.3 代码举例🌰
    • 3. 移动零(LeetCode 283)
      • 3.1 解题思路🎯
      • 3.2 解题过程🎬
      • 3.3 代码举例🌰
    • 4. 比较含退格的字符串(LeetCode 844)
      • 4.1 解题思路🎯
      • 4.2 解题过程🎬
      • 4.3 代码举例🌰
    • 5. 有效数组的平方(LeetCode 977)
      • 5.1 解题思路🎯
      • 5.2 解题过程🎬
      • 5.3 代码举例🌰

1. 算法分析🛸

移除元素这类题的解题思路在于你能否在数组中找到val(这个val有很多种形式,并不是固定的值),并将其按照要求进行移除;

最简单的方法就是通过暴力解决,通过多重循环暴力移除,但这样的代码时间复杂度就会高一些;对此,我们可以使用双指针的方式来解决这类问题:
【题目链接】

定义两个指针:

快指针:用来寻找符合新数组要求的元素

慢指针:用来将旧数组中的元素更新为符合新数组要求的元素

通过循环遍历,让fast指针依次遍历整个旧数组,每找到与val不同的元素(即符合新数组要求),就将这个元素更新到slow指针所在的位置上,然后将slow++,循环结束后slow指针所在位置下标便是整个新数组的数组长度

代码如下

class Solution {public int removeElement(int[] nums, int val) {int slow = 0;for (int fast = 0;fast < nums.length;fast++) {if (nums[fast] != val) {nums[slow++] = nums[fast];}}return slow;}
}

掌握了解题思路后,提供以下几道类型相似的题用来练习:

2. 删除有序数组中的重复性(LeetCode 26)

【题目链接】

2.1 解题思路🎯

双指针

2.2 解题过程🎬

定义两个指针 + 变量val:

快指针:用来寻找未重复出现的元素

慢指针:用来将重复元素更新为未重复出现的元素 val:用来记录最近一次更新的元素 (最开始与数组首元素不一样即可)

通过循环遍历,让fast指针依次遍历整个数组,每找到与val不同的元素,就将这个元素更新到slow指针所在的位置上,然后将slow++,同时更新 val 为 原slow位置更新后的元素,循环重复上述过程,循环结束后slow指针所在位置下标便是整个新数组的数组长度

2.3 代码举例🌰

class Solution {public int removeDuplicates(int[] nums) {int val = nums[0] + 1;int slow = 0;for (int fast = 0;fast < nums.length;fast++) {if (nums[fast] != val) {nums[slow++] = nums[fast];val = nums[fast];}}return slow;}
}

3. 移动零(LeetCode 283)

【题目链接】

3.1 解题思路🎯

双指针

3.2 解题过程🎬

通过定义两个双指针将非零元素都移动到最前面,之后从slow指针所在位置开始遍历一遍数组将后面的值都赋零即可

3.3 代码举例🌰

class Solution {public void moveZeroes(int[] nums) {int slow = 0;for (int fast = 0;fast < nums.length;fast++) {if (nums[fast] != 0) {nums[slow++] = nums[fast];}}for (int i = slow;i < nums.length;i++) {nums[i] = 0;}}
}

4. 比较含退格的字符串(LeetCode 844)

【题目链接】

4.1 解题思路🎯

通过双指针 + 设置变量判断 # 是否被消费来进行字符串元素的删减

4.2 解题过程🎬

这次的指针需要从后面开始遍历,因为 # 退格元素是往左删的

设置快慢指针,变量k用来记录当前未被消费的 # 数量 :

  • 当nums[fast]不等于 # 且k = 0时,更新nums[slow] = nums[fast],且slow++;
  • 当nums[fast]不等于 # 且k > 0时,k 减 1,slow位置不变,fast继续向前遍历;
  • 当nums[fast]等于 # 时,k 加 1,slow位置不变,fast继续向前遍历;

遍历完数组后,此时slow + 1 位置开始 即为字符串经过退格后的正确字符串,返回结果后进行判断即可

4.3 代码举例🌰

class Solution {public boolean backspaceCompare(String s, String t) {String s1 = removeChar(s);String t1 = removeChar(t);if (s1.equals(t1)) {return true;}return false;}public String removeChar(String str) {String[] nums = str.split("");int slow = nums.length -1;int k = 0;for (int fast = nums.length - 1;fast >= 0;fast--) {if (!nums[fast].equals("#")) {if (k == 0) {nums[slow--] = nums[fast];continue;}k--;}else {k++;}}StringBuffer ret = new StringBuffer("");for (int i = slow + 1;i < nums.length;i++) {ret.append(nums[i]);}return ret.toString();}
}

5. 有效数组的平方(LeetCode 977)

【题目链接】

这道题比较特殊,不再是使用快慢指针的方式来解决问题,而是用左右双指针

5.1 解题思路🎯

这道题为我们提供的数组是一个有序的数组,要求我们将数组中的元素平方之后再进行排序返回在这里插入图片描述

很快能想到使用循环 + 库函数的方式就能暴力解决这道题:

class Solution {public int[] sortedSquares(int[] nums) {for (int i = 0;i < nums.length;i++) {nums[i] = nums[i] * nums[i];}Arrays.sort(nums);return nums;}
}

但这样带来的时间复杂度为是O(n + nlogn),有没有更高效的方法?可以用双指针✅

在这道题中,我们需要抓住一个关键点

有序数组中元素平方后的最大值一定是由原数组最左边或者最右边的元素的提供的

找到这个关键点后,我们就能通过双指针的方式解决这个问题了

5.2 解题过程🎬

定义左右双指针,并创建一个新的数组ret用来返回结果,定义一个指针cur从新数组的最后开始赋值,进行判断:

  • 当左指针元素的平方值后大于右指针元素的平方值,此时ret[cur] = nums[left] * nums[left],同时left++, cur–
  • 当右指针元素的平方值后大于左指针元素的平方值,此时ret[cur] = nums[right] * nums[right],同时right–, cur–

遍历结束后返回赋值后的新数组即可

5.3 代码举例🌰

class Solution {public int[] sortedSquares(int[] nums) {int left = 0;int right = nums.length - 1;int[] ret = new int[nums.length];int cur = nums.length - 1;while (left <= right) {int lv = nums[left] * nums[left];int rv = nums[right] * nums[right];if (lv > rv) {ret[cur] = lv;left++;}else {ret[cur] = rv;right--;}cur--;}return ret;}
}

以上便是对移除元素类算法的介绍了!!后续还会继续分享其它算法系列内容,如果这些内容对大家有帮助的话请给一个三连关注吧💕( •̀ ω •́ )✧( •̀ ω •́ )✧✨

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

VSCode rust文件中的api点击无法跳转问题

如果配置了vscode的setting.json windows端的话 "settings": { "typescript.tsc.autoDetect": "off","rust-analyzer.linkedProjects": [".\\gui-btn\\Cargo.toml",".\\temp\\Cargo.toml", ],其他端类似 能不…

C++(9.25)

stack: #include <iostream> using namespace std; class my_stack { private:int* data; // 动态数组&#xff0c;用于存储栈的元素int len; // 当前栈中元素的个数int size; // 栈的最大容量public:// 默认构造函数&#xff0c;初始化容量为 10my_st…

解决input密码框选择浏览器提供的“已保存账户”密码,白色背景色无法去除问题

在新版浏览器&#xff08;我用的edge&#xff09;中&#xff0c;点击聚焦input密码框&#xff0c;会弹出浏览器提供“已保存账户”快捷选中密码&#xff0c;选中之后&#xff0c;input框会变成白色背景。如果你整体背景色是深色的&#xff0c;就会显得突兀。设置input的backgro…

产品推介——SOP4 随机相位可控硅光耦KLM305X

产品描述Product Description KLM305X 系列由一个砷化镓红外发光二极管和一个单晶硅芯片的随机相位光电双向晶闸管组成的可控硅光电耦合器&#xff0c;它被设计用于连接电子控制和功率双向可控硅开关&#xff0c;以控制115至240VAC工作电压下的电阻和感应负载。 功能图Functi…

C++进阶—>这3个问题难道搞不懂多态???

文章目录 &#x1f6a9;前言1、它是什么&#xff1f;2、怎样实现它&#xff1f;&#xff1f;2.1、虚函数是个什么来头&#xff1f;✍2.2、虚函数的重写/覆盖特殊点&#xff01;&#x1f440;2.3、在了解多态的必要条件以及虚函数后&#xff0c;来看下如何编写吧&#x1f440;&a…

【计算机方向】中科院二区TOP神刊!国人发文友好,刊文量高,录用容易!

期刊解析 &#x1f6a9;本 期 期 刊 看 点 &#x1f6a9; 中科院二区TOP期刊&#xff01; 审稿友好&#xff0c;IF4.8&#xff0c;自引率6.2% 最新年度发文530。 今天小编带来计算机领域SCI快刊的解读&#xff01; 如有相关领域作者有意投稿&#xff0c;可作为重点关注&am…

SpringBoot日志集成-LogBack

Log4J&#xff1a;最早的Java日志框架之一&#xff0c;由Apache基金会发起&#xff0c;提供灵活而强大的日志记录机制JDK自带的日志框架&#xff1a;java.util.logging.Logg&#xff0c;是JDK1.4之后提供的日志API&#xff0c;已淘汰logback&#xff1a; logback一个开源的日志…

Java ERP管理系统源码解析:微服务架构实践Spring Cloud Alibaba与Spring Boot

在当今数字化浪潮的推动下&#xff0c;企业对于高效、稳定且易于扩展的管理系统需求日益增长。为了满足这一需求&#xff0c;我们精心打造了一款基于Java技术的鸿鹄ERP&#xff08;Enterprise Resource Planning&#xff09;管理系统。该系统充分利用了Spring Cloud Alibaba、S…

猫头虎 分享已解决Bug: || Module not found: Can‘t resolve ‘react‘ 解决方案

&#x1f42f;猫头虎 分享已解决Bug&#xff1a; || Module not found: Cant resolve react 解决方案 摘要: 今天猫头虎带大家解决一个常见的前端问题&#xff0c;尤其是在 React 项目中&#xff0c;很多开发者在安装依赖包时&#xff0c;遇到过 Module not found: Cant resol…

2024年9月第4周AI资讯

阅读时间&#xff1a;3-4min 更新时间&#xff1a;2024.9.23-2024.9.27 目录 o1 处于OpenAI的AGI5阶段的第2阶段 微软使用核燃料推动AI发展 阿里巴巴和英伟达在自动驾驶方向合作 Meta 推出 AR xAI 眼镜、新型号 o1 处于OpenAI的AGI5阶段的第2阶段 概要 OpenAI 首席执行官 …

智能抠图怎么操作?4款不动手自动抠图的智能神器分享

对于资深的图片设计师们来说&#xff0c;抠图是他们必备的基础技能&#xff0c;没几下功夫就能在PS中操作完成。 然而对于小编这种修图小白来讲&#xff0c;拥有一款傻瓜式智能抠图免费软件&#xff0c;才是硬道理&#xff01; 小到简单的图形文字、大到飞扬细碎的毛发&#…

MySQL第11讲--多表查询的介绍

文章目录 前言多表关系多表查询概述多表查询的分类连接查询内链接外链接自连接 联合查询子查询标量子查询列子查询行子查询表子查询 前言 在MySQL第10讲–约束的介绍中讲了数据库的几种约束条件&#xff1a;非空约束、唯一约束、主键约束、外键约束、检查约束、默认约束。下图对…

Splashtop 加入 Microsoft 智能安全协会

2024年9月25日 美国加利福尼亚州库比蒂诺 Splashtop Inc . 今天宣布已正式加入 Microsoft 智能安全协会&#xff08;MISA&#xff09;。MISA 由独立软件供应商&#xff08;ISV&#xff09;和托管安全服务提供商&#xff08;MISA&#xff09;组成&#xff0c;他们将其解决方案与…

渗透测试-文件上传绕过思路

文件上传绕过思路 引言 分享一些文件上传绕过的思路&#xff0c;下文内容多包含实战图片&#xff0c;所以打码会非常严重&#xff0c;可多看文字表达&#xff1b;本文仅用于交流学习&#xff0c; 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#x…

深度解析APP软件开发:构建卷轴式分销系统的实践探索

在移动互联网的浪潮中&#xff0c;APP软件的开发与应用不断推动着商业模式的创新与发展。其中&#xff0c;卷轴模式分销系统作为一种新兴的营销手段&#xff0c;正逐渐受到市场的青睐。作为程序员&#xff0c;深入探索并实践这一模式的系统开发&#xff0c;不仅是对技术能力的挑…

C++ STL初阶(14): map和set

1.关联式容器与键值对 前导文章&#xff1a;C 二叉树进阶-CSDN博客 之前我们学习的线性的容器&#xff0c;如&#xff1a;vector deque list等都叫作序列式容器 与之对立的概念是关联式容器 关联式容器 也是用来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;其 里面…

【Linux】图解详谈HTTPS的安全传输

文章目录 1.前置知识2.只使用对称加密3.只使用非对称加密 因为私钥加密只能公钥解开&#xff0c;公钥加密只能私钥解开4.双方都是使用非对称加密5.非对称加密 对称加密6.非对称加密对称加密CA认证&#xff08;一&#xff09;CA认证&#xff08;二&#xff09;https &#xff0…

Ks渲染做汽车动画吗?汽车本地渲染与云渲染成本分析

Keyshot是一款强大的实时光线追踪和全域光渲染软件&#xff0c;它确实可以用于制作汽车动画&#xff0c;包括汽车模型的渲染和动画展示。Keyshot的动画功能允许用户创建相机移动、物体变化等动态效果&#xff0c;非常适合用于汽车动画的制作。 至于汽车动画的渲染成本&#xff…

手机如何五开玩梦幻西游端游?用GameViewer远程手机免费畅玩梦幻西游

用手机就能免费玩梦幻西游端游&#xff0c;还可以随时查看挂机进度&#xff01; 想要实现这一点&#xff0c;就用网易GameViewer远程&#xff0c;而且不光手机可以玩梦幻西游端游&#xff0c;平板也能免费玩&#xff0c;并为你实现五开玩梦幻西游端游。 那么&#xff0c;通过Ga…

[001-03-007].第28节:SpringBoot整合Redis:

6.1.Redis的介绍&#xff1a; 1.Redis 是一个开源&#xff08;BSD许可&#xff09;的&#xff0c;内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。2.它支持多种类型的数据结构&#xff0c;如 字符串&#xff08;strings&#xff09;&#xff0c; 散…