双指针问题2

文章目录

  • 1. 有效三角形的个数(611)
  • 2. 查找总价格为目标值的两个商品(LCR179)
  • 3. 三数之和(15)
  • 4. 四数之和(18)


1. 有效三角形的个数(611)

题目描述:
在这里插入图片描述

算法原理:
这题使用的方法要进行理解首先要知道一个比较基础的数学知识就是三角形的三条边当中只要最短的那两条边的和大于第三条边那么这三条边就是可以构成三角形的,具体原因就不阐述了其实也很简单。
知道了这个数学知识我们首先要做的就是将数组进行升序排序,以此来方便我们后续进行操作。我们从数组的最后一个元素开始遍历到数组的2下标的元素,这个元素位置记为i,事实上可以使用for循环完成这个遍历。然后对于i位置元素的左边的数组元素进行分析,在for循环内部定义left指针指向0位置,right指针指向i-1位置。因为我们将nums[i]的值视为第三条边的长度,nums[left]和nums[right]视为第一条边和第二条边的长度,那么此时分为两种情况。
第一种情况就是nums[left]+nums[right]>nums[i]那么此时是可以构成三角形的,因为nums[left]加上nums[right]都可以大于nums[i],显然在nums数组的left+1~right-1下标的元素加上nums[right]都会大于nums[i],也就是可以构成三角形,所以我们无需去遍历这个区间内的元素就可以直接得到在固定三角形第二条边和第三条边长度的情况下有多少种不同可以构成三角形的三元组,最终将right–,并且将最终返回的ret也就是返回的可以构成三角形的三元组的个数加上right-left。
第二种情况就是nums[left]+nums[right]<=nums[i]那么此时是不可以构成三角形的,因为此时连nums[right]加上nums[left]都已经小于nums[i],显然在nums数组的left+1~right-1下标的元素加上nums[left]都会小于nums[i],也就是不可以构成三角形,所以也是一样我们无需去遍历这个区间内的元素直接跳过即可,最终将left++。
重复以上两种情况的判断,直至right和left相遇,这相当于在开始的for循环中再去写一个循环去处理nums数组的0~i-1这个区间,具体逻辑如代码所示。
代码如下:

class Solution {public int triangleNumber(int[] nums) {int n = nums.length;Arrays.sort(nums);int ret = 0;for (int i = n - 1; i >= 2; i--) {int left = 0;int right = i - 1;while (left < right) {int temp = nums[left] + nums[right];if (temp > nums[i]) {ret += right - left;right--;} else {left++;}}}return ret;}
}

题目链接

2. 查找总价格为目标值的两个商品(LCR179)

题目描述:
在这里插入图片描述

算法原理:
其实这一题是可以使用二分查找直接做出来的,但是在学习一种方法的时候就要尽量多的去使用它,从而逐渐熟练,因此这里使用双指针的方法。跟上题使用相似的思想,就是定义left和right指针来不断缩小区间范围,满足条件跳出循环然后返回一种结果即可。
代码如下:

class Solution {public int[] twoSum(int[] price, int target) {int right = price.length - 1;int left = 0;while (left < right) {if (price[left] + price[right] > target) {right--;} else if (price[left] + price[right] < target) {left++;} else {break;}}return new int[] { price[left], price[right] };}
}

题目链接

3. 三数之和(15)

题目描述:
在这里插入图片描述

算法原理:
这一题也是和前面的思想类似,不过这里需要先给数组排序得到升序的数组,然后固定住第三个数nums[i](这里的i可以取2到nums.length-1,2是因为至少要留两个值作为前两个数),在0到i-1这个区间内去找到两个值满足nums[left]+nums[right]=-nums[i],这一题就转化为和第一题一致的题目,就可以使用做第一题使用的方法甚至说代码都可以直接套用。但是不同的一点在于,第一题得到的三元组可以重复,但是这一题不可以,所以我们要进行去重,在找到符合条件的三元组后left和right指针移动之后要判断该位置元素和前一个是否相同,如果相同就直接跳过不同就可以继续进行处理,当然这里的跳过过程要注意越界的问题。我们对于固定的第三个数也要进行去重,道理也是一样,就是i进行移动后,要判断当前位置元素和前一个是否相同,如果相同直接跳过,这样就完成了去重。
代码如下:

class Solution {public List<List<Integer>> threeSum(int[] nums) {int n = nums.length;Arrays.sort(nums);List<List<Integer>> retList = new ArrayList<>();for (int i = n - 1; i >= 2; i--) {int left = 0;int right = i - 1;while (right > left) {int sum = nums[left] + nums[right];if (sum > -nums[i]) {right--;} else if (sum < -nums[i]) {left++;} else {retList.add(new ArrayList(Arrays.asList(nums[left], nums[right], nums[i])));left++;right--;while (left < right && nums[left] == nums[left - 1]) {left++;}while (right > left && nums[right] == nums[right + 1]) {right--;}}}while (i > 1 && nums[i] == nums[i-1]) {i--;}}return retList;}
}

题目链接

4. 四数之和(18)

题目描述:
在这里插入图片描述

算法原理:
这题和上一题三数之和就是一致的,但是就是这里要多套一层循环去多固定一个数,也就是通过两层循环固定两个数分别为nums[i]和nums[j],然后根据题意nums[left]+nums[right]需要满足target-nums[i]-nums[j]这样的条件。另外就是也需要去重,相比三数之和就是多对一层循环去一次重。
代码如下:

class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> list = new ArrayList();Arrays.sort(nums);int n = nums.length;for (int i = n - 1; i > 2;) {for (int j = i - 1; j > 1;) {int left = 0;int right = j - 1;long aim =  (long)target - nums[i] - nums[j];while (left < right) {int temp = nums[left] + nums[right];if (temp > aim) {right--;} else if (temp < aim) {left++;} else {list.add(new ArrayList(Arrays.asList(nums[left], nums[right], nums[j], nums[i])));left++;right--;while (left < right && nums[left - 1] == nums[left]) {left++;}while (left < right & nums[right + 1] == nums[right]) {right--;}}}j--;while (j > 1 && nums[j + 1] == nums[j]) {j--;}}i--;while (i > 2 && nums[i + 1] == nums[i]) {i--;}}return list;}
}

题目链接

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

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

相关文章

逻辑蕴含、函数依赖集的闭包、Armstrong公理、属性集闭包

一、引言 Armstrong公理-从给定的函数依赖集得到关系模式的完整依赖集 二、逻辑蕴含 1、定义 设F是关系模式R上的函数依赖集&#xff0c;X、Y是R的属性子集&#xff0c;对于R的每个满足F的关系实例r&#xff0c;若函数 依赖都成立&#xff0c;则称F逻辑蕴含。 记为&#…

Mamaba3--RNN、状态方程、勒让德多项式

Mamaba3–RNN、状态方程、勒让德多项式 一、简单回顾 在Mamba1和Mamba2中分别介绍了RNN和状态方程。 下面从两个图和两个公式出发&#xff0c;对RNN和状态方程做简单的回顾&#xff1a; R N N : s t W s t − 1 U x t &#xff1b; O t V s t RNN: s_t Ws_{t-1}Ux_t&…

shadertoy-安装和使用

一、安装vscode 安装vscode流程 二、安装插件 1.安装glsl编辑插件 2.安装shader toy插件 三、创建glsl文件 test.glsl文件 float Grid(float size, vec2 fragCoord) {vec2 r fragCoord / size;vec2 grid abs(fract(r - 0.5) - 0.5) / fwidth(r);float line min(grid…

Linux内核开发-编译内核源码

前言 大部分公司的所谓的Linux内核工程师主要工作是基于社区开源内核进行定制化修改&#xff0c;基本不会有机会向上游提供patch&#xff0c;仅限于公司内部业务的修修补补。 作为内核开发工程师两年多&#xff0c;精力一直被公司业务消耗&#xff0c;所有的内核知识都来自于…

异构集成封装类型2D、2.1D、2.3D、2.5D和3D封装技术

异构集成封装类型&#xff1a;2D、2.1D、2.3D、2.5D和3D封装详解 简介随着摩尔定律的放缓&#xff0c;半导体行业越来越多地采用芯片设计和异构集成封装来继续推动性能的提高。这种方法是将大型硅芯片分割成多个较小的芯片&#xff0c;分别进行设计、制造和优化&#xff0c;然后…

【深度学习驱动流体力学】计算流体力学openfoam-paraview与python3交互

目的1:配置 ParaView 中的 Python Shell 和 Python 交互环境 ParaView 提供了强大的 Python 接口,允许用户通过 Python 脚本来控制和操作其可视化功能。在 ParaView 中,可以通过 View > Python Shell 菜单打开 Python Shell 窗口,用于执行 Python 代码。要确保正确配置 …

[Linux] vi编辑器

命令模式&文本模式 命令模式就输入命令然后执行&#xff0c;文本模式就是系统把你的输入都当成写进文件里的字符 切换模式&#xff1a; 刚进入默认是命令模式&#xff0c;按: i I a A o O 进入文本模式&#xff0c; 通过他们进入文本模式有什么不同&#xff1f; 然后按esc进…

python 版本切换,更换当前默认版本

电脑可以安装多个版本&#xff0c;但是好像没有正规的维护python版本的工具&#xff0c;比如前端就有nvm切换node版本&#xff0c;但是python我没找到比较好的&#xff08;有大佬知道路过方便留言一下&#xff0c;跪谢。。&#xff09; 废话不多说&#xff0c;更改默认版本很简…

DIVE INTO DEEP LEARNING 36-49

文章目录 36. Data augmentation36.1 Training with enhanced data36.2 Enhancement measures36.3 Data augmentation summary 37. Fine tuning37.1 Fine tuning Introduce37.2 Fine tuning Step37.3 Fine tuning summary 38. Object detection38.1 Object detection38.2 Edge …

[Linux] Shell

chsh不是一种sh,而是一个命令行使用程序&#xff0c;用于更改默认shell CentOS是个开源软件&#xff0c;没有sh,sh是商业版的&#xff0c; 按ls /bin/*sh显示的sh实际上是个链接文件&#xff0c;连接的bash 在命令行输入新的sh名&#xff0c;会启动一个新的进程&#xff0c; 输…

厂里资讯之app端文章搜索

app端文章搜索 1) 内容介绍 文章搜索 ElasticSearch环境搭建 索引库创建 文章搜索多条件复合查询 索引数据同步 搜索历史记录 Mongodb环境搭建 异步保存搜索历史 查看搜索历史列表 删除搜索历史 联想词查询 联想词的来源 联想词功能实现 2) 搭建ElasticSearch环境 …

MyBatis系列七: 一级缓存,二级缓存,EnCache缓存

缓存-提高检索效率的利器 官方文档 一级缓存基本介绍快速入门Debug一级缓存执行流程一级缓存失效分析 二级缓存基本介绍快速入门Debug二级缓存执行流程注意事项和使用细节 mybatis的一级缓存和二级缓存执行顺序小实验细节说明 EnCache缓存基本介绍配置和使用EhCache细节说明 My…

SpringBoot整合Minio(支持公有及私有bucket)

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; SpringBoot整合Minio(支持公有及私有bucket) ⏱️ 创作时间&#xff1…

张大哥笔记:如何选择一个人就值得做的副业

很多人喜欢把上班称为主业&#xff0c;把上班之外的工作称为副业&#xff0c;不管以哪种方式称呼都可以&#xff0c;只要能赚钱就行&#xff0c;上班的本质就是出卖时间&#xff0c;不管你是月入5000还是月入2万&#xff0c;都是给老板打工&#xff01; 但搞笑的就是月入2万的人…

关于app爬虫的环境准备

摘要 有些数据需要在手机应用中才能查看&#xff0c;没有网页版&#xff0c;所以学习移动端的爬虫是有必要的。 手机系统分为安卓和苹果两大系统&#xff0c;本次讲解主要以安卓手机为例 有安卓手机的可以使用手机&#xff0c;没有的可以使用模拟器&#xff0c;本次以夜神模…

基于C++、MFC和Windows套接字实现的简单聊天室程序开发

一、一个简单的聊天室程序 该程序由服务器端和客户端两个项目组成&#xff0c;这两个项目均基于对话框的程序。服务器端项目负责管理客户端的上线、离线状态&#xff0c;以及转发客户端发送的信息。客户端项目则负责向服务器发送信息&#xff0c;并接收来自服务器的信息&#…

[机器学习算法]决策树

1. 理解决策树的基本概念 决策树是一种监督学习算法&#xff0c;可以用于分类和回归任务。决策树通过一系列规则将数据划分为不同的类别或值。树的每个节点表示一个特征&#xff0c;节点之间的分支表示特征的可能取值&#xff0c;叶节点表示分类或回归结果。 2. 决策树的构建…

《STM32 HAL库》小米微电机控制例程——通信协议分析及驱动库

之前有段时间因为机器狗项目的缘故&#xff0c;一直在使用小米微电机&#xff0c;但是苦于没有一个详尽的奶妈级教程&#xff0c;在控制电机的学习中踩了不少的坑。今天咱们就从头至尾一步一步的实现使用按键控制小米微电机。本文将会分析小米电机驱动库&#xff0c;并简要介绍…

练手代码之使用Python实现合并PDF文件

如果你有合并PDF的需要&#xff0c;你会怎么办 我们无所不能的程序员会选择写一个Python代码来实现&#xff08;谁会这么无聊&#xff1f;是我&#xff09;&#xff0c;如果真的有PDF操作需要&#xff0c;我推荐你使用PDF Expert这个软件哈~ 话不多说直接上代码&#xff1a; …

Linux操作系统学习:day05

内容来自&#xff1a;Linux介绍 视频推荐&#xff1a;[Linux基础入门教程-linux命令-vim-gcc/g -动态库/静态库 -makefile-gdb调试]( 目录 day0530、删除用户31、添加和删除用户组创建用户组删除用户组 32、修改密码33、使用tar工具进行压缩和解压缩压缩解压缩 34、使用zip u…