《算法通关村——双指针妙用》

news2024/9/22 23:24:00

《算法通关村——双指针妙用》

删除元素

描述

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

例子1: 输入:nums = [3,2,2,3], val = 3 
输出:2, nums = [2,2] 
例子2: 输入:nums = [0,1,2,2,3,0,4,2], val = 2 
输出:5, nums = [0,1,4,0,3]

三种解决方法解决

/**
 * 删除指定元素用快慢指针,慢指针用于填充不删除的值,快指针用于查找目标值
 * @param nums
 * @param val
 * @return
 */
public static  int removeElement(int[] nums,int val){
    int slow = 0;
    // fast充当快指针
    for(int fast = 0;fast<nums.length;fast++){
        if(nums[fast] != val){
            nums[slow] = nums[fast];
            slow++;
        }
    }
    return slow;
}

/**
 * 对撞指针的方法,两个指针从两边走,左边如果不相等(不等于目标值)就往后,right等于目标值就往前。
 * @param nums
 * @param val
 * @return
 */
public static int removeElement1(int[] nums,int val){
    int right = nums.length-1;
    int left = 0;
    while(left <= right){
        if((nums[left]==val) && (nums[right]!= val)){
            int temp = nums[right];
            nums[right] = nums[left];
            nums[left] = temp;
        }
        if(nums[left] != val)  left++;
        if(nums[right]==val) right--;
    }
    return left;
}

/**
 * 双指针+覆盖,这种就是直接覆盖了,如果从左开始有值等于目标值,就把他替换成从右边开始的值,然后右边指针移动,左边不动,
 * 然后再次判断左边原位置是否是目标值,如果是就继续覆盖,右边指针继续移动,如果不是左边指针移动。
 * @param nums
 * @param val
 * @return
 */
public static int removeElement2(int[] nums, int val){
    int right = nums.length - 1;
    for(int left = 0; left<=right;){
        if(nums[left] == val){
            nums[left] = nums[right];
            right--;
        }else{
            left++;
        }
    }
    return right+1;
}

删除重复项

描述

给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。

示例1: 
输入:nums = [1,1,2] 
输出:2, nums = [1,2] 
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。  
例子2: 
输入:nums = [0,0,1,1,1,2,2,3,3,4] 
输出:5, nums = [0,1,2,3,4] 
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

解决

/**
 * 删除数组中重复元素,返回数组的大小。慢指针进行存值覆盖,快指针判断是否为重复值。
 * @param nums
 * @return
 */
public static int removeDuplicates(int[] nums){
    // slow表示可以放入新元素位置,索引为0的元素不用管.
    int slow = 1;
    // 循环起到了快指针的作用
    for(int fast = 0;fast < nums.length;fast++){
        if(nums[fast] != nums[slow-1]){
            nums[slow] = nums[fast];
            slow++;
        }
    }
    return slow;
}

近期在自学 Java 做项目,加入了一个编程学习圈子,里面有编程学习路线和原创的项目教程,感觉非常不错。还可以 1 对 1 和大厂嘉宾交流答疑,也希望能对大家有帮助,扫 ⬇️ 二维码即可加入。

在这里插入图片描述

也可以点击链接:我正在「编程导航」和朋友们讨论有趣的话题,你⼀起来吧?

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

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

相关文章

代碼隨想錄算法訓練營|第四十五天|1049. 最后一块石头的重量 II、494. 目标和、474.一和零。刷题心得(c++)

目录 讀題 1049. 最后一块石头的重量 II 自己看到题目的第一想法 看完代码随想录之后的想法 494. 目标和 自己看到题目的第一想法 看完代码随想录之后的想法 474.一和零 自己看到题目的第一想法 看完代码随想录之后的想法 1049. 最后一块石头的重量 II - 實作 思路 …

Redis -- 基础知识2

1.Redis客户端介绍 1.基础介绍 Redis是一种客户端-服务器结构的程序&#xff0c;通过网络进行互动 客户端的多种形态 1.自带了命令行客户端&#xff1a;redis-cil 2.图形化界面的客户端&#xff1a;依赖windows系统&#xff0c;连接服务器有诸多限制&#xff0c;不建议使用 3.基…

简单而高效:使用PHP爬虫从网易音乐获取音频的方法

概述 网易音乐是一个流行的在线音乐平台&#xff0c;提供了海量的音乐资源和服务。如果你想从网易音乐下载音频文件&#xff0c;你可能会遇到一些困难&#xff0c;因为网易音乐对其音频资源进行了加密和防盗链的处理。本文将介绍一种使用PHP爬虫从网易音乐获取音频的方法&…

Fastq文件的获取

Fastq文件的获取 Fastq文件的获取linux 下安装SRA Toolkit工具使用SRA Toolkit工具下载SRA数据 Fastq文件的获取 author:CYH-BI date:2023.10.25 Fastq文件得获取 ,可以从NCBI获取&#xff0c;也可以自己测序得到结果&#xff0c;下面介绍从网上获取数据。 linux 下安装SRA…

MySQL3:MySQL中一条更新SQL是如何执行的?

MySQL3&#xff1a;MySQL中一条更新SQL是如何执行的&#xff1f; MySQL中一条更新SQL是如何执行的&#xff1f;1.Buffer Pool缓冲池2.Redo logredo log作用Redo log文件位置redo log为什么是2个&#xff1f; 3.Undo log4.更新过程5.InnoDB官网架构InnoDB架构-内存结构①Buffer …

【uniapp+云函数调用】人脸识别,实人认证,适用于app,具体思路解析,已实现

2023.10.8 需求: uniapp开发的app项目中使用人脸识别 app项目都是第一次搞,更别提人脸识别了。目前已有的就是Dcloud账号已申请,实现需求的时间没那么紧迫 此篇会详细记录从0到1的过程 2023.10.24 今天开始探究实现的过程 可能会记录的有些冗余 效果图如下: uniapp开发指南…

GoLong的学习之路(九)语法之结构体(非常重要,不看就等于不会Go语言)

书接上回&#xff0c;上回书说到&#xff0c;map等数据结构&#xff0c;接下来说结构体 文章目录 类型别名和自定义类型自定义类型别名类型定义和类型别名的区别 结构体结构体的定义结构体实例化基本实例化 匿名结构体创建指针类型结构体并取用获取结构体指针取用结构体 结构体…

NewStarCTF2023week4-More Fast(GC回收)

打开链接&#xff0c;存在很多个类&#xff0c;很明显是php反序列化漏洞利用&#xff0c;需要构造pop链 &#xff0c; 关于pop链构造的详细步骤教学&#xff0c;请参考我之前的博客&#xff0c;真的讲得很详细也容易理解&#xff1a; http://t.csdnimg.cn/wMYNB 如果你是刚接…

降本增效神器?Share Creators 智能数字资产管理系统真香!

降本增效似乎是一个持续又永久的话题。尤其在今年&#xff0c; 显得格外的重要~ 在各行各业都受到了疫情所带来巨大冲击的背景下&#xff0c;降本增效对很多企业来说不再是锦上添花&#xff0c;而可能是一条唯一的出路。 随着市场的收缩和竞争的加剧&#xff0c;在更“卷”的…

树形数据增删改查

功能描述&#xff1a; 默认展示所有项目点击项目展示当前项目下的所有区域点击区域展示当前区域下的所有工位以上以树形图格式展示项目&#xff0c;区域&#xff0c;和工位都可进行增加 修改 和删除&#xff0c;每个图标hover时显示对应提示信息项目&#xff0c;区域&#xff…

数据库数据恢复—Oracle数据库报错ORA-01110错误的数据恢复案例

Oracle数据库故障&#xff1a; 北京某公司一台运行oracle数据库的服务器&#xff0c;机房意外断电导致该服务器重启&#xff0c;重启后发现oracle数据库报错。该Oracle数据库没有备份。 Oracle数据库数据恢复过程&#xff1a; 1、北亚企安数据恢复工程师检查该oracle数据库的数…

外卖跑腿小程序开发是否需要定期更新和维护?

外卖跑腿小程序已成为现代生活的一部分&#xff0c;但它们的成功和可靠性取决于持续的定期更新和维护。本文将探讨为什么外卖跑腿小程序需要定期更新和维护&#xff0c;以及如何实施这些关键的技术措施。 为什么需要定期更新和维护&#xff1f; 1. 改进性能和稳定性 外卖跑…

Android Studio模拟器/虚拟设备连接互联网的方法

如图&#xff0c;无线、网络都无法联网 找到本机的DNS 找到emu-launch-params.txt&#xff0c;添加DNS -dns-server 192.168.124.1 重启虚拟机&#xff0c;关闭无线

Python使用psycopg2读取PostgreSQL的geometry字段出现二进制乱码

1、问题 读取geometry字段出现二进制乱码 查询语句&#xff1a; sql "select * from public"Note: 这种写法在PostgreSQL中直接查询, 没有问题&#xff0c;不会报错。 但是在Python中查询&#xff0c;如果导出的geom还是一长串的geometry 格式的话&#xff0c; …

Anaconda创建环境出现一堆DEBUG

问题描述如图所示&#xff1a; 试了好几种方法&#xff0c;比如以为是清华的源不能用了嘛&#xff0c;然后改了之后发现不行&#xff1b;然后又以为是anaconda出啥问题了&#xff0c;卸了重装发现都没能解决。 但是好在没有放弃啊哈哈&#xff1a;【试试下面这个】 解决办法&a…

clion安装C++远程linux开发并调试 从装centos虚拟机到完美开发调试

下载镜像 阿里云镜像 从vmware上安装虚拟机并提权开放ssh 更新编译环境 一般 gcc gdb 版本都是比较低的&#xff0c;适配不了clion的最低要求。 升级gdb参考博客 升级gcc参考博客 安装CMAKE 官方的源使用wget即可下载 未找到openssl的解决办法 注意版本&#xff0c;又踩个…

C语言--有 n 个整数,使前面各数顺序向后移 m 个位置,最后 m 个数变成最前面的 m个数,见下图,写一个函数实现该功能

图解&#xff1a; 代码&#xff1a; void Move(int* arr, int n, int m) {if (m < 0 || m > n)return;//创建m个长度的int数组int* brr (int*)malloc(m * sizeof(int));assert(brr ! NULL);if (brr NULL)return;//把后面的m个数字移到新数组int i;for (i 0; i <…

【Axure高保真原型】图片手电筒效果

今天和大家分享图片手电筒效果的原型模板&#xff0c;鼠标移入图片区域后&#xff0c;会显示一个光圈&#xff0c;光圈会跟随鼠标移动&#xff0c;照亮对应的区域&#xff1b;鼠标拖动时可以移动地图图片&#xff0c;查看更多区域的内容&#xff0c;具体效果可以打开下方原型地…

【linux】安装rpmrebuild

rpmrebuild是一种从已经安装的包中构建RPM文件的工具。它可以用于轻松构建修改后的包&#xff0c;并适用于任何使用RPM的Linux发行版。 访问地址 rpm rebuild download | SourceForge.net 选择版本 版本地址&#xff1a;版本地址 下载安装包 安装 rpm -ivh rpmrebuild-2.15…

探索光模块的MSA多源协议

在当今高度互联的世界中&#xff0c;光模块作为网络设备的重要部分&#xff0c;其性能和质量直接影响到整个网络系统的运行。其中光模块由于其灵活性和高效性&#xff0c;已经成为数据中心和云计算领域的主要选择。本文易天光通信将深入探讨光模块的MSA协议&#xff0c;揭示其重…