【java算法专场】双指针(下)

611. 有效三角形的个数

目录

611. 有效三角形的个数

算法思路

算法代码

LCR 179. 查找总价格为目标值的两个商品

算法思路

 算法代码

HashSet

双指针

15. 三数之和

算法思路

算法代码 

18. 四数之和

​编辑算法思路

算法代码 


611. 有效三角形的个数

算法思路

 

算法代码

/*** 计算可能的三角形数量。** @param a 一个整数数组,数组中的元素代表三角形的边长。* @return 返回可能构成的三角形的数量。*/public int triangleNumber(int[] a) {// 如果数组为空,则无法构成任何三角形if(a.length==0) return 0;// 对数组进行排序,以便后续通过比较边长来判断是否可以构成三角形Arrays.sort(a);//给数组排序// 初始化计数器,用于记录可以构成的三角形的数量int count=0;// 用来计算三角形个数// 从最长的边开始检查,逐步减少边长,以找到所有可能的三角形组合int n= a.length-1;while(n>=2){// 使用双指针技术,左指针指向最短边,右指针指向最长边,中间的边长由数组排序决定int left=0;int right=n-1;while(left<right){// 如果当前选择的三条边满足构成三角形的条件,则增加计数器,并移动右指针// 如果a+b大于c,那么此时可以构成三角形,且在【left,right】内的所有情况都可以构成三角形//count+=right-left,right--if(a[left]+a[right]>a[n]){count+=right-left;right--;}else{// 如果不满足条件,则移动左指针,尝试其他可能的边长组合// 如果a+b小于c,那么此时无法构成三角形,让left++left++;}}// 检查完一组边长后,减少最长边的长度,继续检查下一组//当判断完后,让n--n--;}// 返回可以构成的三角形的总数量return count;}

LCR 179. 查找总价格为目标值的两个商品

算法思路

 

 算法代码

HashSet

 public int[] twoSum(int[] price, int target) {Set<Integer> set=new HashSet<>();int i=0;for(;i<price.length;i++){if(set.contains(target-price[i])){return new int[]{target-price[i],price[i]};}else{set.add(price[i]);}}return new int[]{-1,-1};}

双指针

/*** 使用双指针方法查找数组中两个数的和等于特定目标值的索引。* 这个方法避免了对每个可能的组合进行显式的迭代,通过调整左右指针来缩小搜索范围。** @param a 输入的整数数组。* @param target 目标值,我们需要找到两个数的和等于这个值。* @return 包含这两个数索引的数组。如果不存在这样的两个数,则返回{-1, -1}。*/public int[] twoSum(int[] a, int target) {// 初始化左指针为数组的起始位置// 利用双指针int left = 0;// 初始化右指针为数组的结束位置int right = a.length - 1;// 当左指针小于右指针时,执行循环while (left < right) {// 计算当前左右指针所指元素的和int sum = a[left] + a[right];// 如果和大于目标值,移动右指针,减小和if (sum > target) {right--;}// 如果和小于目标值,移动左指针,增大和else if (sum < target) {left++;}// 如果和等于目标值,返回当前左右指针的索引else {return new int[]{a[left], a[right]};}}// 如果没有找到合适的组合,返回{-1, -1}return new int[]{-1, -1};}

15. 三数之和

算法思路

算法代码 

    /*** 寻找数组中所有不重复的三元组,这些三元组的和为零。* * @param nums 输入的整数数组* @return 返回一个列表,包含所有和为零的不重复三元组*/public List<List<Integer>> threeSum(int[] nums) {// 初始化结果列表List<List<Integer>> res = new ArrayList<>();// 如果数组长度小于3,无法找到满足条件的三元组,直接返回空列表if (nums.length < 3) {return res;}// 初始化指针k,用于遍历数组int k = 0;// 遍历数组,直到k指向的元素后至少还有两个元素for (; k < nums.length - 2;) {// 初始化左指针left,指向k后的第一个元素int left = k + 1;// 初始化右指针right,指向数组最后一个元素int right = nums.length - 1;// 计算目标值,即要找到的三个数的和,这里取当前k指向的数的相反数int target = -nums[k];// 当左指针小于右指针时,进行循环while (left < right) {// 计算当前左指针和右指针指向的数的和int sum = nums[left] + nums[right];// 如果和大于目标值,说明右指针太靠右,需要向左移动if (sum > target) {right--;}// 如果和小于目标值,说明左指针太靠左,需要向右移动else if (sum < target) {left++;}// 如果和等于目标值,找到了一个满足条件的三元组else {// 将这个三元组添加到结果列表中res.add(Arrays.asList(nums[k], nums[left], nums[right]));// 移动左指针和右指针,继续寻找下一个满足条件的三元组left++;right--;// 跳过所有与当前左指针指向的数相同的元素,避免重复while (left < right && nums[left] == nums[left - 1]) {left++;}// 跳过所有与当前右指针指向的数相同的元素,避免重复while (left < right && nums[right] == nums[right + 1]) {right--;}}}// 移动k指针,继续寻找下一个可能的三元组k++;// 跳过所有与当前k指针指向的数相同的元素,避免重复while (k < nums.length - 2 && nums[k] == nums[k - 1]) {k++;}}// 返回结果列表return res;}

18. 四数之和

算法思路

考虑下面这种情况,我们需要给aim使用 long类型,并将target也强转为long

算法代码 

 /*** 寻找数组中所有不重复的四个数,使得它们的和等于指定的目标数。** @param nums 输入的整数数组。* @param target 目标和。* @return 返回一个列表,包含所有满足条件的四个数的组合。*/public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> res = new ArrayList<>();// 如果数组长度小于4,无法找到四个数的组合,直接返回空结果if (nums.length < 4) {return res;}Arrays.sort(nums);// 双层循环遍历数组,第一层循环选择第一个数,第二层循环选择第二个数for(int t=0;t<nums.length-3;){for(int k=t+1;k<nums.length-2;){// 计算剩余两个数的目标和long aim=(long)target-nums[t]-nums[k];// 使用双指针法寻找剩余的两个数int left=k+1;int right=nums.length-1;// 当左指针小于右指针时,执行循环while(left<right){// 当前两个数的和int sum=nums[left]+nums[right];// 如果当前和小于目标和,左指针右移if(aim>sum) left++;// 如果当前和大于目标和,右指针左移else if(aim<sum) right--;// 如果当前和等于目标和,将四个数的组合添加到结果中else {res.add(Arrays.asList(nums[t],nums[k],nums[left],nums[right]));// 移动左指针和右指针,避免重复组合left++; right--;// 跳过所有与前一个数相同的数,避免重复组合while(left<right && nums[left]==nums[left-1]) left++;while(left<right && nums[right]==nums[right+1]) right--;}}// 移动第二个数的指针,避免重复组合k++;while(k<nums.length-2 && nums[k]==nums[k-1]) k++;}// 移动第一个数的指针,避免重复组合t++;while(t<nums.length-3 && nums[t]==nums[t-1]) t++;}return res;}

 以上就是双指针专题篇的内容,若有不足,欢迎指正~

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

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

相关文章

骗子用出国月薪3万骗了1000多万上千名求职者被骗

日前,江苏省南通市崇川区人民法院开庭审理了一起涉及诈骗的案件,该案件 审理后引发全国求职者的关注以及热议。根据了解得知,这起案件的主犯是利用出 国劳务的虚假高薪职位位诱饵,最终有上千名求职者被骗上当了。文章来源于&#xff1a;股城网www.gucheng.com 根据法院审…

PostgREST API 安装及基础使用

PostgREST是一个独立的Web服务器&#xff0c;它将PostgreSQL数据库转换为RESTful API。它提供基于基础数据库的结构自定义的API。 PostgREST安装 首先访问Releases PostgREST/postgrest (github.com)&#xff0c;根据安装平台选择下载的源码。比如我现在的设备是Mac但是我的…

mysql判断时间段是否重合

mysql判断时间段是否重合 SELECT CASE WHEN t1.start_time < t2.end_time AND t1.end_time > t2.start_time THEN ‘重合’ ELSE ‘不重合’ END AS result FROM table_name t1, table_name t2 WHERE t1.id <> t2.id;

图片批量重命名bat,一个脚本快速搞定图片批量重命名

BAT 批处理 是一种在 Microsoft Windows 操作系统中使用的脚本语言&#xff0c;用于自动执行一系列预定义的命令或任务。这些命令集合通常存储在一个文本文件中&#xff0c;文件扩展名为 .bat 或 .cmd。批处理脚本可以包含简单的命令&#xff0c;如文件复制、移动、删除&#x…

如何用IP地址申请SSL证书实现网络安全

互联网是一个全球性的网络&#xff0c;它将世界各地的计算机系统和设备连接在一起。在这个庞大的网络中&#xff0c;每个设备都需要一个唯一的标识符&#xff0c;即IP&#xff08;Internet Protocol&#xff09;地址&#xff0c;以便其他设备能够找到并与其通信。然而&#xff…

[C++]: 模板进阶

标题&#xff1a;[C]&#xff1a; 模板进阶 水墨不写bug 目录 一、非类型模板参数 &#xff08;1&#xff09;、非类型模板参数简介 &#xff08;2&#xff09;、非类型模板参数实例 二、模板的特化 &#xff08;1&#xff09;函数模板特化 &#xff08;2&#xff09;类…

免费的SSL证书能使用吗

SSL证书为网站提供数据安全加密&#xff0c;保护数据传输&#xff0c;提升用户信任。 现在免费的SSL证书还能使用吗&#xff1f;答案是肯定的。个人博客、个人的网站目前使用免费SSL证书的居多&#xff0c;另外一些单位在网站上线前&#xff0c;也会使用免费SSL证书对网站进行…

不容错过!手把手教你开启微信通话自动录音功能!(含手机端和电脑端)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 微信自动录音 📒📝 方法一📝 方法二📝 电脑端自动录音📝 注意事项⚓️ 相关链接 ⚓️📖 介绍 📖 在商务沟通或重要对话中,通话录音功能可以帮助我们记录关键信息,避免遗漏,同时也是证据保存的一种手段。虽然微…

自定义在线活动报名表单小程序源码系统 源代码+搭建部署教程 可二次定制开发

系统概述 在数字化时代&#xff0c;线上活动成为连接用户与组织的重要桥梁。为了高效地管理活动报名流程&#xff0c;一款灵活、易用的在线活动报名表单小程序显得尤为重要。本文旨在为开发者提供一套全面的解决方案&#xff0c;包括自定义在线活动报名表单小程序的源代码分析…

关于解决双屏幕鼠标移动方向问题

1.点开设置》系统》屏幕 2.分清屏幕标识&#xff0c;一般笔记本为1 3.点击要移动的屏幕&#xff0c;然后按住鼠标左键不方进行移动 感谢您的浏览&#xff0c;希望可以帮到您&#xff01;

【SpringCloud】概述 -- 微服务入门

在Java的整个学习过程中&#xff0c;大家势必会听见一些什么分布式-微服务、高并发、高可用这些专业术语&#xff0c;给人的感觉很高级&#xff0c;有一种高深莫测的感觉。可以看一下这篇博客对这些技术架构的演变有一个初步的认识: 服务端⾼并发分布式结构演进之路-CSDN博客文…

昇思MindSpore学习笔记6-04计算机视觉--Shufflenet图像分类

摘要&#xff1a; 记录MindSpore AI框架使用ShuffleNet网络对CIFAR-10数据集进行分类的过程、步骤和方法。包括环境准备、下载数据集、数据集加载和预处理、构建模型、模型训练、模型评估、模型测试等。 一、概念 1.ShuffleNet网络 旷视科技提出的CNN模型 应用在移动端 通…

【LLM之Agent】ReAct论文阅读笔记

研究背景 论文介绍了 “ReAct” 范式&#xff0c;该范式旨在融合推理和行动的功能&#xff0c;通过让大型语言模型&#xff08;LLMs&#xff09;生成既包括言语推理轨迹又包括行动序列的输出&#xff0c;解决多种语言推理和决策任务。这种方法允许模型在与外部环境&#xff08…

Ubuntu22.04.4 LTS系统/安装Anaconda【GPU版】

安装过程 1.wget命令行下载 下载Anaconda并保存文件至本地指定目录 wget -c https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh -P ~/Downloads/anaconda3 查看是否下载好了 2.安装Anaconda 2.1 bash命令安装 bash后面是anaconda3下载好的路径 bash …

补光灯LED照明 2.7V4.2V5V升60V80V100V升压恒流芯片IC-H6902B

H6902B升压恒流芯片IC确实是一款为LED照明应用设计的稳定且可靠的解决方案。这款芯片具有以下几个显著特点&#xff1a; 高效率&#xff1a;效率高达95%以上&#xff0c;这意味着在驱动LED灯时&#xff0c;电源到LED的能量转换效率非常高&#xff0c;减少了能量损失&#xff0…

untiy 在菜单栏添加自定义按钮 点击按钮弹出一个Unity窗口,并在窗口里添加属性

using System.Collections.Generic; using UnityEditor; using UnityEngine; using UnityEngine.Rendering.PostProcessing;public class AutoGenerateWindow : EditorWindow //这是定义一个窗口 {public string subjecttName "科目名字";//科目的名字public GameOb…

【JavaWeb】登录校验-会话技术(三)过滤器Filter与拦截器Interceptor、异常处理

过滤器Filter 什么是Filter&#xff1f; Filter表示过滤器&#xff0c;是 JavaWeb三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能 使用了过滤器之后&#xff0c;要想访问web服务器上的资源&#xff0c;必须先…

在线PS新功能:一键抠图轻松搞定

Photoshop&#xff0c;设计界的巨头软件&#xff0c;是多少设计小白入门的噩梦。Photoshop下载难度大&#xff0c;Photoshop收费贵&#xff0c;PS暂存盘已满&#xff0c;PS操作难度大...为了减少设计师被Photoshop压制&#xff0c;设计工具市场不断升级发展&#xff0c;即时设计…

大连网站制作需要注意哪些问题

在制作大连网站时&#xff0c;需要注意以下几个问题&#xff1a; 1. 目标受众&#xff1a;首先要明确网站的目标受众是谁&#xff0c;根据受众的特点和需求来设计网站的内容和结构。比如&#xff0c;如果目标受众是年轻人&#xff0c;网站的设计风格可以更加时尚和前卫&#xf…

昇思MindSpore学习笔记6-05计算机视觉--SSD目标检测

摘要&#xff1a; 记录MindSpore AI框架使用SSD目标检测算法对图像内容识别的过程、步骤和方法。包括环境准备、下载数据集、数据采样、数据集加载和预处理、构建模型、损失函数、模型训练、模型评估等。 一、概念 1.模型简介 SSD目标检测算法 Single Shot MultiBox Detecto…