当前位置: 首页 > news >正文

算法--双指针二

算法原理

双指针

常见的双指针有两种形式,一种是对撞指针,一种是左右指针

对撞指针:一般用于顺序结构中,也称左右指针,对撞指针一般从两端向中间移动,终止条件一般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循环)

快慢指针:又叫龟兔赛跑算法,基本思想就是使用两个移动速度不同的指针在数组或链表等结构上移动(我们在数据结构学习链表解决链表有环问题的时候用到了这种算法)

题目解析

5.有效三角形的个数

https://leetcode.cn/problems/valid-triangle-number/

题目解析

给定一个包含非负整数的数组nums,返回其中可以组成三角形三条边的三元组个数

三角形两边之和大于第三边,两步之差小于第三边

如果a<=b<=c--->只要a+b>c就可以构成三角形

算法原理

解法一:暴力枚举

先固定一个数,然后再找两个数,三层for循环

时间复杂度较高

解法二:利用单调性,使用双指针算法

根据题目解析中“如果a<=b<=c--->只要a+b>c就可以构成三角形”,并且题目中对返回的数字顺序并未要求,那么我们可以先对数组排序

数组此时已经按照从小到大的顺序排列,我们可以从后固定一个c,然后一个left,一个right指针进行移动

如果a+b>c 那么这个c对应着right-left种组合,中间的一定可以构成三角形 然后right--

如果a+b<=c,那么left左移

代码实现

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

6.和为s的两个数

https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof/description/

题目解析

 输入一个递增的数组和一个数字s,在数组中查找两个数,使得他们的和正好为s,如果有多对,则随意输出一对即可

算法原理

解法一:暴力枚举  时间复杂度过高

for(int i=0;i<nums.length;i++)

        for(int j=i+1;i<nums.length;j++)

                check(nums[i]+nums[j],s]

解法二:利用单调性,使用双指针

代码实现

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

7.三数之和

https://leetcode.cn/problems/3sum/description/

题目解析

给一个整数数组nums,判断是否存在【nums【i】,nums【j】,nums【k】】,满足i!=k,j!=k,i!=j,同时三数相加为0,返回所有和为0且不重复的三元组(注意:输出的顺序和三元组的顺序并不重要)

算法原理

解法一:排序(因为题目说输出的顺序和三元组的顺序并不重要)+暴力枚举+set去重

解法二:排序+双指针

1.排序        2.固定一个数a(并且这个数要小于0,否则在已经有序的情况下不可能找到符合要求的两个数)

3.在该数后的区间。利用双指针算法,找到和为-a

ps:1.去重 找到一种结果之后,left和right必须要跳过重复的元素        使用完一次双指针算法后,i也要跳过重复的元素

        2.不漏:找到一种结果后,不要停,缩小区间,继续寻找

代码实现

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

8.四数之和

https://leetcode.cn/problems/4sum/description/

题目解析

给n个整数组成的数组nums和一个目标值t,返回满足全部条件并且不重复的四元组 0<=a,b,c,d<n

a b c d 互不相同

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

算法原理

解法一:排序+暴力枚举+set去重

解法二:排序+双指针

1.依次固定一个数a

2.在a后的区间内,利用“三数之和”,使三数之和=t-a

细节:1.不重 跳过重复元素

           2.不漏 找到一种结果后,不要停,缩小区间,继续寻找

代码实现

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

http://www.dtcms.com/a/490766.html

相关文章:

  • RK3576开发板/核心板应用分享之开源鸿蒙
  • 公司网站页脚外包公司的业务员
  • [crackme]028-ArturDents-CrackMe#3
  • 黑盒测试与白盒测试
  • 为安防装上“智慧大脑”:解密视频融合平台EasyCVR的智能分析技术内核
  • 同一设备多账号登录,如何避免消息推送“串门”?
  • 【Linux】认识Framebuffer
  • 深圳做网站公司有哪些公司英文购物网站模板下载
  • 力扣热题100道之560和位K的子数组
  • Pixel-Perfect Depth with Semantics-Prompted Diffusion Transformers,nips 2025
  • 网站可以换主机吗做外贸网站 用国外空间 还是 国内空间 区别
  • **SLAM技术:探索现代定位与地图构建的新纪元**在现代科技领域,同步定位与地图构建(SLAM)技术已成为机器人导航和自动驾驶等领
  • 环保教育展厅建设方案-VR垃圾分类体验游戏-垃圾分类拍拍乐
  • 网站空间怎么更换莱芜在线论坛最新消息
  • 龙岩做网站哪家好如何绑定网站域名
  • [Linux系统编程——Lesson14.基础IO:系统文件IO]
  • golang的一些技巧
  • 高性能 Go 语言带 TTL 的内存缓存实现:精确过期、自动刷新、并发安全
  • ML.NET机器学习框架基本流程介绍
  • Day32_【 NLP _2.RNN及其变体 _(2) LSTM】
  • 重庆建站模板代理怎么做p2p网站
  • iis配置网站是什么网站建设方案书阿里云模板
  • 【计算机视觉】SAM 3 技术深潜:从“分割万物”到“理解概念”的范式转移
  • 「深度学习笔记3」概率论深度解析:从不确定性到人工智能的桥梁
  • 齐河专业企业网站建设做网站引流到天猫
  • 技术贴!【谷歌浏览器】实用工具推荐之谷歌浏览器(Google Chrome)离线纯净版完全安装指南:告别广告与捆绑骚扰
  • Centos7 自建Umami-开源免费的网站访问流量统计分析平台
  • 申威架构安装Java 11 RPM包教程:java-11.0.7-swjdk-11u-8.ky10.sw_64.rpm详细安装步骤
  • 【STM32项目开源】基于STM32的人体健康监测系统
  • 一个做礼品的网站国外网站用什么dns