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

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

文章目录

  • 【算法系列-数组】移除元素 (双指针)
    • 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;
    }
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

黑马智数Day4-1

新增月卡 配置路由完成跳转 {path: /cardAdd,component: () > import(/views/car/car-card/add-card) }<el-button type"primary" click"$router.push(/cardAdd)">添加月卡</el-button> 车辆信息表单验证 <el-form :model"carInf…

【移植】一种快速移植OpenHarmony Linux内核的方法

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 移植概述 本文面向希望将 OpenHarmony 移植到三方芯片平台硬件的开…

接档《凡人修仙传》的《牧神记》动画,能否成为黑马?

堪称B站国创半边天的《凡人修仙传》第三季将在10月19日迎来完结&#xff0c;接档它的是由玄机科技制作&#xff0c;改编自宅猪同名网络小说的《牧神记》。这部将于10月27日播出的“玄机娘娘新崽”&#xff0c;能否成功接下《凡人修仙传》的好彩头&#xff0c;成为国漫界下一匹黑…

LeetCode[中等] 78.子集

给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的 子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 思路 迭代法 每次遍历nums中的新的数&#xff0c;将其加到之前所有得到的set中&#xff0c…

【第十六章:Sentosa_DSML社区版-机器学习之生存分析】

【第十六章&#xff1a;Sentosa_DSML社区版-机器学习之生存分析】 16.1 加速失效时间回归 1.算子介绍 加速失效时间回归模型Accelerated failure time (AFT)是一个监督型参数化的回归模型&#xff0c;它可以处理删失数据。它描述了一个生存时间的对数模型&#xff0c;所以它通…

深度解读 2024 Gartner DevOps 魔力象限

上周 Gartner 刚发布了 2024 年度的 DevOps 魔力象限。我们也第一时间来深度解读一下这份行业里最权威的报告。 和2023年对比 23 年入围 14 家厂商&#xff0c;24 年入围 11 家。4 家厂商从报告中消失&#xff0c;分别是 Bitrise, Codefresh, Google Cloud Platform (GCP), VM…

SpringBoot集成Redis及SpringCache缓存管理

1.集成Redis 1.导入依赖 <!--spirngboot springdata对redis支持--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2.配置信息 #数据源配置…

服务器端请求伪造(SSRF)漏洞解析

免责申明 本文仅是用于学习检测自己搭建的靶场环境有关SSRF的原理和攻击实验,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其所在国家地区相关法规内…

欺诈文本分类检测(十七):支持分类原因训练

1. 引言 前文数据校正与增强进行了数据增强&#xff0c;本文将使用增强后的数据对模型进行进一步训练&#xff0c;以便得到能同时预测出分类标签、欺诈者、分类原因多个信息的模型。 为此&#xff0c;我们需要对整个训练过程进行调整&#xff0c;包括&#xff1a; 交叉训练逻…

3-1.Android Fragment 之创建 Fragment

Fragment Fragment 可以视为 Activity 的一个片段&#xff0c;它具有自己的生命周期和接收事件的能力&#xff0c;它有以下特点 Fragment 依赖于 Activity&#xff0c;不能独立存在&#xff0c;Fragment 的生命周期受 Activity 的生命周期影响 Fragment 将 Activity 的 UI 和…

信安 实验1 用Wireshark分析典型TCP/IP体系中的协议

我发现了有些人喜欢静静看博客不聊天呐&#xff0c; 但是ta会点赞。 这样的人呢帅气低调有内涵&#xff0c; 美丽大方很优雅。 说的就是你&#xff0c; 不用再怀疑哦 实验1 用Wireshark分析典型TCP/IP体系中的协议 实验目的 通过Wireshark软件分析典型网络协议数据包&a…

C++深入学习string类成员函数(3):访问与修饰

引言 在 C 中&#xff0c;std::string 提供了丰富的成员函数来访问和修改字符串中的字符。通过这些函数&#xff0c;程序员可以灵活地处理字符串中的各个元素&#xff0c;无论是读取特定位置的字符&#xff0c;还是修改字符串的内容。此外&#xff0c;std::string 类还确保了访…

FileZilla Server 黑白单移除

我使用FileZilla Server 搭建了一个FTP服务在内网使用&#xff0c;主要用于做数据备份的。 有一台服务器一直可以正常连接&#xff0c;突然有一天不能连接了。一开始我以为是FTP服务器出问题了&#xff0c;就一直没管。后来我测试了一下其他IP都可以正常连接FTP服务器&#xff…

STM32嵌入式编程学习到提高:【4】UART串口打印

------------------------------------------------------------------------------------------------------------------------- 工程文件&#xff1a;放在百度云盘里&#xff0c;需要的自行下载&#xff01;&#xff01;&#xff01; 链接: https://pan.baidu.com/s/14gRne…

Gartner 报告解读(二)| Open Telemetry可观测性解读与使用建议

上期跟大家解读了Gartner 成熟度曲线报告&#xff0c;主要分享了影响中国IT使用的4大因素--自主可控计划、AI发展趋势影响、降本增效、IT基础设施现代化程度。新来的朋友点这里&#xff0c;一键了解具体内容。 Gartner 成熟度曲线报告解读&#xff08;一&#xff09;| 2024中国…

Apifox 9月更新|「动态值」全新升级、跨团队引用接口和测试场景、测试报告交互优化

Apifox 新版本上线啦&#xff01;&#xff01;&#xff01; 看看本次版本更新主要涵盖的重点内容&#xff0c;有没有你所关注的功能特性&#xff1a; 「动态值」全新升级 更强大、更灵活的数据模拟能力 支持智能代码补全动态值 测试报告交互优化 支持跨团队引用接口和测试场…

Unity图形用户界面!*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。(万字解析)

Unity 3D GUI 简介 游戏开发过程中&#xff0c;开发人员往往会通过制作大量的图形用户界面&#xff08; Graphical User Interface&#xff0c;GUI &#xff09;来增强游戏与玩家的交互性。 Unity 3D 中的图形系统分为 OnGUI、NGUI、UGUI等&#xff0c;这些类型的图形系统内容…

Django 数据库配置以及字段设置详解

配置PostGre 要在 Django 中配置连接 PostgreSQL 数据库&#xff0c;并创建一个包含“使用人”和“车牌号”等字段的 Car 表 1. 配置 PostgreSQL 数据库连接 首先&#xff0c;在 Django 项目的 settings.py 中配置 PostgreSQL 连接。 修改 settings.py 文件&#xff1a; …

数据定义语言CREATE的应用

新书速览|SQL Server 2022从入门到精通&#xff1a;视频教学超值版_sql server 2022 出版社-CSDN博客 《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) SQL Se…

【Python】1.初始Python--打开Python的大门

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…