【算法】双指针(下)

目录

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

暴力解题

双指针解题

三数之和

双指针解题(左右指针)

四数之和

双指针解题

双指针关键点

注意事项


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

题目链接:LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode)

题目描述

输⼊⼀个递增排序的数组和⼀个数字 s ,在数组中查找两个数,使得它们的和正好是 s 。如果有多

对数字的和等于 s ,则输出任意⼀对即可。

⽰例 1:

输⼊: nums = [2,7,11,15], target = 9

输出: [2,7] 或者 [7,2]

暴力解题

class Solution {public static int[] twoSum(int[] price, int target) {int n=price.length;int[] array=new int[2];for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){if(price[i]+price[j]==target){array[0]=price[i];array[1]=price[j];return array;}}}return array;}
}

双指针解题

解题思路:由于数组是升序的,我们可以使用【左右指针】,left和right指针分别指向最小值和最大值,判断其和是否等于目标值target。相等的话则直接返回,结束遍历

如果不相等,有两种情况:

·和小于target:采取增大最小值,逐渐接近target。即left++

·和大于target:采取减小最大值,逐渐接近target。即right--

解题代码

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

三数之和

题目链接:15. 三数之和 - 力扣(LeetCode)

题目描述

给你⼀个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满⾜ i != j、i != k 且 j

!= k ,同时还满⾜ nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

⽰例 1:

输⼊:nums = [-1,0,1,2,-1,-4]

输出:[[-1,-1,2],[-1,0,1]]

解释:

nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。

nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。

nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。

不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。

注意,输出的顺序和三元组的顺序并不重要。

⽰例 2:

输⼊:nums = [0,1,1]

输出:[]

解释:唯⼀可能的三元组和不为 0 。

⽰例 3:

输⼊:nums = [0,0,0]

输出:[[0,0,0]]

解释:唯⼀可能的三元组和为 0 。

提⽰:

3 <= nums.length <= 3000

-10^5 <= nums[i] <= 10^5

双指针解题(左右指针)

题目分析:我们需要在数组中,找到满足 和为0且不重复 的三元组

重点不重复

解题思路:既然是三元组,我们选择固定一个元素temp,然后只需找到 【和为-temp的二元组】 即可

1.排序,并且固定最大值(假设下标为i):因为如果不排序,随机固定一个元素,无法使用双指针找到 【和为-nums[i]的二元组】。

2.找到 【和为-temp的二元组】:使用【左右指针】,left指针指向0,right指针指向 左侧的位置

如下图:

本题如何保证【不重复】呢?

·在找到一个【二元组】后,left和right指针需要【跳过重复】的元素:首先需要先跳过已找到的【二元组】,即left++,right--。其次,如果新的left、right处的元素与上一个【二元组】的数相同,也需要跳过。

·当使用完一次双指针算法后,固定的i也要【跳过重复】的元素:即当left和right指针相遇后,i--之后(for循环实现),如果新的i处的元素与前一个i处的元素相等,需要额外的i--

假设最大值的下标为i,区间[left,right]是i位置左边的区间--也就是比i小的区间:

如果nums[left]+nums[right]>-nums[i]:这时需要减小【较大值】(right--),尝试接近-nums[i]

如果nums[left]+nums[right]<-nums[i]:这时需要增大【较小值】(left++),尝试接近-nums[i]

优化:在寻找三数之和为0时,当三个数中最大的那个数小于0时,三数之和只能小于0。

解题代码

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

四数之和

题目链接:18. 四数之和 - 力扣(LeetCode)

题目描述

给你⼀个由 n 个整数组成的数组 nums ,和⼀个⽬标值 target 。请你找出并返回满⾜下述全部条件

且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素⼀⼀对应,则认为

两个四元组重复):

0 <= a, b, c, d < n

a、b、c 和 d 互不相同

nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

⽰例 1:

输⼊:nums = [1,0,-1,0,-2,2], target = 0

输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

⽰例 2:

输⼊:nums = [2,2,2,2,2], target = 8

输出:[[2,2,2,2]]

提⽰:

1 <= nums.length <= 200

-10^9 <= nums[i] <= 10^9

-10^9 <= target <= 10^9

题目分析:我们需要在数组中,找到满足 和为target且不重复 的四元组

重点不重复(解决方法与三数之和类似,这里不进行阐述)

双指针解题

解题思路:与三数之和类似。由于这里是【四元组】,我们选择固定两个元素。然后 只需使用【左右指针】,找到一个【二元组】使其与固定的两个元素之和等于目标值(target)即可。

注意:由于 -10^9 <= nums[i] <= 10^9,当nums[i]+nums[j]+nums[left]+nums[right]时,这里可能会导致超出int类型的最大值,所以需要强制类型转换为(long)

解题代码

class Solution {
public static List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> arr=new ArrayList<>();Arrays.sort(nums);int n=nums.length;//固定一个最小值和一个最大值for(int i=0;i<n;i++){//去重while(i<n&&i!=0&&nums[i]==nums[i-1]) i++;for(int j=n-1;j>i;j--){//去重while(j>i&&j!=n-1&&nums[j]==nums[j+1]) j--;int left=i+1;int right=j-1;while(left<right){long sum=(long)nums[i]+nums[j]+nums[left]+nums[right];if(sum==target){arr.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));left++;right--;//去重while(left<right&&nums[left]==nums[left-1]) left++;while(left<right&&nums[right]==nums[right+1]) right--;}else if(sum>target){right--;}else{left++;}}}}return arr;}
}

双指针关键点

1.初始化

通常,双指针被初始化为指向数据结构(如数组)的开始和结束,或者根据问题的具体要求进行其他初始化

2.移动规则

指针的移动规则取决于要解决的问题。例如,在寻找有序数组中的两数之和(如本章的第一题)时,如果当前两数之和小于目标值,则左指针右移以增加和;如果大于目标值,则右指针左移以减小和

3.停止条件

当指针相遇或交叉,或者满足问题的特定条件时,遍历结束

4.空间复杂度

双指针技术通常具有O(1)的额外空间复杂度,因为它只需要维护两个指针的位置,而不需要额外的数据结构来存储数据

注意事项

1.边界条件:在使用双指针时,要特别注意边界条件,确保指针不会越界或指向无效的位置

2.指针的同步移动:根据问题的要求,指针可能需要同步移动(如同时向右移动),或者按照特定的规则异步移动(如一个指针固定,另一个指针移动)

3.问题的转化:有时,将问题转化为可以使用双指针技术解决的形式才是关键。例如,通过排序将无序数组转化为有序数组,从而可以应用双指针技术。

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

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

相关文章

Windows 图形显示驱动开发-IoMmu 模型

输入输出内存管理单元 (IOMMU) 是一个硬件组件&#xff0c;它将支持具有 DMA 功能的 I/O 总线连接到系统内存。 它将设备可见的虚拟地址映射到物理地址&#xff0c;使其在虚拟化中很有用。 在 WDDM 2.0 IoMmu 模型中&#xff0c;每个进程都有一个虚拟地址空间&#xff0c;即&a…

软件测评报告包括哪些内容?第三方软件测评机构推荐

在当今信息技术飞速发展的时代&#xff0c;软件的品质与性能直接影响到企业的运营效率和市场竞争力。为了确保软件的可用性和可靠性&#xff0c;软件测评成为一个不可或缺的环节&#xff0c;软件测评报告也是对软件产品进行全面评估后形成的一份文档&#xff0c;旨在系统地纪录…

深浅拷贝区别,怎么区别使用

在 JavaScript 中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09; 和 浅拷贝&#xff08;Shallow Copy&#xff09; 是两种不同的对象复制方式&#xff0c;它们的区别主要体现在对嵌套对象的处理上。以下是它们的详细对比及使用场景&#xff1a; 1. 浅拷贝&#xff08;Sh…

tailscale + derp中继 + 阿里云服务器 (无域名版)

使用tailscale默认的中转节点延迟很高&#xff0c;因为服务器都在国外。 感谢大佬提供的方案&#xff1a;Tailscale 搭建derp中继节点&#xff0c;不需要域名&#xff0c;不需要备案&#xff0c;不需要申请证书&#xff08;最新&#xff09; - yafeng - 博客园 基于这个方案&…

【异常错误】pycharm debug view变量的时候显示不全,中间会以...显示

异常问题&#xff1a; 这个是在新版的pycharm中出现的&#xff0c;出现的问题&#xff0c;点击view后不全部显示&#xff0c;而是以...折叠显示 在setting中这么设置一下就好了&#xff1a; 解决办法&#xff1a; https://youtrack.jetbrains.com/issue/PY-75568/Large-stri…

【DeepSeek系列】04 DeepSeek-R1:带有冷启动的强化学习

文章目录 1、简介2、主要改进点3、两个重要观点4、四阶段后训练详细步骤4.1 冷启动4.2 推理导向的强化学习4.3 拒绝采样和有监督微调4.4 针对所有场景的强化学习 5、蒸馏与强化学习对比6、评估6.1 DeepSeek-R1 评估6.2 蒸馏模型评估 7、结论8、局限性与未来方向 1、简介 DeepS…

车载音频配置(二)

目录 OEM 自定义的车载音频上下文 动态音频区配置 向前兼容性 Android 14 车载音频配置 在 Android 14 中,AAOS 引入了 OEM 插件服务,使你可以更主动地管理由车载音频服务监督的音频行为。 随着新的插件服务的引入,车载音频配置文件中添加了以下更改: • OEM 自定义的车…

禁止WPS强制打开PDF文件

原文网址&#xff1a;禁止WPS强制打开PDF文件_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何避免WPS强制打开PDF文件。 方法 1.删除注册表里.pdf的WPS绑定 WinR&#xff0c;输入&#xff1a;regedit&#xff0c;回车。找到&#xff1a;HKEY_CLASSES_ROOT\.pdf删除KWPS.PDF…

深入解析NoSQL数据库:从文档存储到图数据库的全场景实践

title: 深入解析NoSQL数据库:从文档存储到图数据库的全场景实践 date: 2025/2/19 updated: 2025/2/19 author: cmdragon excerpt: 通过电商、社交网络、物联网等12个行业场景,结合MongoDB聚合管道、Redis Stream实时处理、Cassandra SSTable存储引擎、Neo4j路径遍历算法等42…

用 Biome 替代 ESLint 和 Prettier

简介 ESLint 和 Prettier ESLint&#xff1a;代码质量检查工具&#xff0c;确保代码风格一致与无错误 Prettier&#xff1a;代码格式化工具&#xff0c;自动美化代码布局 所以&#xff1a;ESLint Prettier 能自动美化代码、自动检查代码错误的工具 Biome Biome&#xff1a;…

6.3 DBMS的功能和特征

文章目录 DBMS的6大功能DBMS的3个特征DBMS的分类 DBMS的6大功能 DBMS包含数据定义&#xff0c;数据库操作&#xff08;检索、插入、修改、删除&#xff09;&#xff0c;数据库运行管理&#xff08;保证多用户环境下正常运行&#xff09;&#xff0c;数据组织、存储、管理&…

力扣hot100——找到字符串中的所有字母异位词

给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 解法思路&#xff1a; 1. // 判断字符相等&#xff0c;其实就是给定一个定长的窗口去滑动查找子串&#xff0c;为了便于判断将p 与窗口中的子…

前端插件使用xlsx-populate,花样配置excel内容,根据坐添加标替换excel内容,修改颜色,合并单元格...。

需求要求&#xff1a;业务人员有个非常复杂得excel表格&#xff0c;各种表头等&#xff0c;但是模板是固定得。当然也可以实现在excel上搞出各种表格&#xff0c;但是不如直接用已有模板替换其中要动态得内容方便&#xff0c;这里我们用到CSDN得 xlsx-populate 插件。 实列中我…

未来AI方向落地场景:小语言模型,super_private_agent

未来AI方向落地场景:小语言模型,super_private_agent 目录 未来AI方向落地场景:小语言模型,super_private_agent小语言模型super - private - agent(注重隐私的智能代理)碳基生命和硅基生命交互界面面向agent的专用交互协议和数据接口从web平台经济到网络平台举例说明社交…

Coze扣子新功能详解

今晚(2025-01-24)扣子再次进行更新 主要更新内容&#xff1a; 搭建小程序和 H5 用户界面时&#xff0c;支持使用音频组件播放音频内容 数据库操作体验提升 界面优化&#xff1a;对数据库详情界面进行了重新设计&#xff0c;并将工作流运行数据库的测试数据位置从原工作流底…

汇能感知的光谱相机/模块产品有哪些?

CM020A 分辨率&#xff1a;1600H1200V 光谱范围&#xff1a;350~950nm 光谱分辨率&#xff1a;1nm 接口&#xff1a;USB2.0 帧率&#xff1a;16001200 (6帧) 输出格式&#xff1a;Raw 8bit FOV&#xff1a;D73.5H58.8V44.1 相机尺寸&#xff1a;505055mm VM02S10 分辨率…

Ollama 本地GUI客户端:为DeepSeek用户量身定制的智能模型管理与交互工具

Ollama 本地GUI客户端&#xff1a;为DeepSeek用户量身定制的智能模型管理与交互工具 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xf…

OpenMv识别色块通过串口发给STM32

硬件连接 1、Openmv端 这里OpenMV端仅作为数据的发送端,所以只需要共地,以及OpenMV的TX(P4)与开发板的RX端连接即可。 2、STM32端 将开发板连接STM芯片RX端与转串口TX端的跳帽取下,再将OpenMV的TX端(P4)与STM的RX连接。如果使用USB转TTL则将TTL的RX端与STM的TX端连接…

以太网交换基础(涵盖二层转发原理和MAC表的学习)

在当今的网络世界中&#xff0c;以太网交换技术是局域网&#xff08;LAN&#xff09;的核心组成部分。无论是企业网络、学校网络还是家庭网络&#xff0c;以太网交换机都扮演着至关重要的角色。本文将详细介绍以太网交换的基础知识&#xff0c;包括以太网协议、帧格式、MAC地址…

菜鸟之路Day15一一IO流(一)

菜鸟之路Day15一一IO流&#xff08;一&#xff09; 作者&#xff1a;blue 时间&#xff1a;2025.2.8 文章目录 菜鸟之路Day15一一IO流&#xff08;一&#xff09;0.概述1.初识IO流1.1.什么是IO流&#xff1f;1.2.IO流的作用1.3.IO流的分类 2.IO流的体系结构3.字节输出流的基本…