【Java 优选算法】双指针(下)

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



有效三角形的个数

题目链接

解法

解法1:暴力枚举--->O(n^3)

解法2:利用单调性,使用双指针来解决---->O(n^2)

  1. 优化:对整个数组进行排序
  2. 先固定最大数
  3. 在最大数的左区间内,使用双指针算法,快速统计出符合要求的个数

统计分为两种情况:

  • 能构成三角形的 a+b>c 
  • 不能构成三角形的 a+b<=c 

画图举例

代码

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

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

题目链接

解法

解法一:暴力枚举,时间复杂度:O(n^2)--->超时

解法二:利用单调性,使用双指针算法解决,时间复杂度:O(n)

用sum表示两数相加的值,t表示目标值,无非就三种情况:

  • sum<t  ---->left++
  • sum>t  --->right--
  • sum=t  ---->返回结果

注意:本题一定是有返回结果的,但为了照顾编译器,最后可以随意返回一个数组

画图举例

代码

class Solution {public int[] twoSum(int[] price, int target) {int sum=0,left=0,right=price.length-1;while(left<right){sum=price[left]+price[right];if(sum<target){left++;}else if(sum>target){right--;}else{return new int[]{price[left],price[right]};}}//照顾编译器return new int[]{0};}
}

三数之和

题目链接

解法

解法一:排序+暴力枚举+利用set去重, 时间复杂度:O(n^3)

解法二:排序+双指针

  1. 排序
  2. 固定一个数a
  3. 在该数后面的区间内,利用"双指针算法"快速找到两个数的和等于 -a即可

处理细节问题:

  • 去重
    1. 找到一种结果后,left和right指针要跳过重复的元素,
    2. 当使用完一次双指针算法之后,i也要跳过重复元素(细节1和2都要避免越界)
  • 不漏
    • 找到一种结果之后,不要停,缩小区间,继续寻找

画图举例

代码

class Solution {public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);List<List<Integer>> ret=new ArrayList<>();int n=nums.length;for(int i = 0;i < n;){if(nums[i] > 0) break;int left=i+1,right =n-1,target=-nums[i];while(left < right){int sum=nums[left]+nums[right];if(sum > target) right--;else if(sum < target) left++;else{ret.add(new ArrayList<Integer>(Arrays.asList(nums[i],nums[left],nums[right])));left++;right--;//缩小区间,继续寻找//left,right去重while(left < right && nums[left] == nums[left-1]) left++;while(left < right && nums[right] == nums[right+1]) right--;}}i++;//i去重while(i < n && nums[i] ==nums[i-1]) i++;}return ret;}
}

四数之和

题目链接

解法

解法1:排序 + 暴力枚举 + 利用set去重

解法2: 排序 + 双指针(主要利用"三数之和"(上一题)的思路)

  1. 依次固定一个数a;
  2. 在a后面的区间内,利用"三数之和" 找到三个数,是这三个数等于target-a即可
    1. 依次固定一个数b
    2. 在b的后面的区间内,利用双指针找到两个数,是这两个数的和等于target-a-b即可

处理细节:

  • 不重
  • 不漏

画图举例

代码

class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {Arrays.sort(nums);List<List<Integer>> ret = new ArrayList<>();int n = nums.length;for(int i=0;i<n;){//固定数afor(int j=i+1;j<n;){//固定数bint left=j+1,right=n-1;long aim=(long)target-nums[i]-nums[j];//可能有溢出的风险,所以用longwhile(left<right){int sum = nums[left] + nums[right];if(sum > aim) right--;else if(sum < aim) left++;else{ret.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));left++; right--;//left 和 right 去重while(left < right && nums[left] == nums[left-1]) left++;while(left < right && nums[right] == nums[right+1]) right--;} }j++;//j去重while(j<n && nums[j] == nums[j-1]) j++;}i++;//i去重while(i<n && nums[i] == nums[i-1]) i++;}return ret;}
}

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

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

相关文章

微服务_入门1

文章目录 一、 认识微服务二、 微服务演变2.1、 单体架构2.2、 分布式架构2.3、 微服务2.4、 微服务方案对比 三、 注册中心3.1、 Eureka3.2、 Nacos3.2.1、服务分级存储模型3.2.2、权重配置3.2.3、环境隔离 一、 认识微服务 二、 微服务演变 随着互联网行业的发展&#xff0c;…

Spark Streaming基础概论

1. 简介 1.1 什么是 Spark Streaming&#xff1f; Spark Streaming 是 Apache Spark 的一个扩展模块&#xff0c;专门用于处理实时数据流。它通过将数据流切分为一系列小批次&#xff08;微批次&#xff09;进行处理&#xff0c;使得开发者能够使用与批处理相同的 API 来处理…

【MRI基础】混叠伪影

基本概念 混叠&#xff08;aliasing&#xff09;&#xff0c;也称为环绕伪影(wrap around artifacts)&#xff0c;是一种常见的伪影&#xff0c;当视场 (FOV) 小于实际成像物体时&#xff0c;可能会在磁共振成像 (MRI) 中出现。空间定位由选定组织样本内的自旋频率决定。选定视…

正点原子阿尔法ARM开发板-IMX6ULL(六)——通过官方SDK完成实验

文章目录 一、引言1.1 cc.h1.2 main.c1.2 fsl_common.h、MCIMX6Y2.h、fsl_iomuxc.h1.3 对于宏定义能多个参数 其他 一、引言 在开发过程中&#xff0c;如果一个人来写寄存器、汇编等东西&#xff0c;会变得特别繁琐&#xff0c;好在官方NXP官方给出了SDK包&#xff0c; 1.1 c…

解决IDEA每次创建新项目时都要指定Maven仓库和Maven配置文件的问题

文章目录 0. 前言1. 打开新项目的设置2. 搜索 Maven 相关的配置3. 更改Maven主路径、配置文件、本地仓库4. 更改新项目的Maven配置后没生效 0. 前言 在 IDEA 中每次创建新项目时&#xff0c;使用的都是默认的 Maven 仓库和默认的配置文件&#xff0c;需要我们手动修改&#xf…

对称密码中的密钥是如何实现安全配送的?

对称密码在设计时就存在一个天然的缺陷&#xff0c;就是要求通信双方都要持有相同的密钥。确保密钥的安全传输和防止密钥泄露&#xff0c;往往比加密算法本身更为复杂和困难。一旦密钥被第三方获取&#xff0c;通信的安全性就会受到严重威胁&#xff0c;从而可能暴露敏感信息。…

网络协议全景:Linux环境下的TCP/IP、UDP

目录 1.UDP协议解析1.1.定义1.2.UDP报头1.3.特点1.4.缓冲区 2.TCP协议解析2.1.定义2.2.报头解析2.2.1.首部长度&#xff08;4位&#xff09;2.2.2.窗口大小2.2.3.确认应答机制2.2.4.6个标志位 2.3.超时重传机制2.4.三次握手四次挥手2.4.1.全/半连接队列2.4.2.listen2.4.3.TIME_…

Git rebase 的使用(结合图与案例)

目录 Git rebase 的使用Git rebase 概念Git rebase 原理rebase和merge的选择 Git rebase 的使用 在 Git 中整合来自不同分支的修改主要有两种方法&#xff1a;merge 以及 rebase Git rebase 概念 **rebase概念&#xff1a;**用来重新应用提交&#xff08;commits&#xff09…

指针式仪表识别

源码下载&#xff1a;小宅博客网 效果如下&#xff1a; 工程结构&#xff1a; 说明&#xff1a; 源码是针对下面这种刻度&#xff0c;并且单个指针的仪表的 如果是下面这种&#xff0c;刻度线被连接起来的&#xff0c;目前不支持转换成仪表单位&#xff0c;只能输出指针角度&…

操作系统名词_文件下载_反弹shell_1

目录 名词解释 Poc、EXP、Payload与shellcode 后门 木马、病毒 黑白盒测试 社会工程学、撞库 ATT&CK 应用实例 实用案例1&#xff1a;文件上传下载-解决无图形化&解决数据传输 实用案例2&#xff1a;反弹shell命令-解决数据回显&解决数据通讯 结合案例1&…

构建响应式API:FastAPI Webhooks如何改变你的应用程序

FastAPI&#xff0c;作为一个现代、快速&#xff08;高性能&#xff09;的Web框架&#xff0c;为Python开发者提供了构建API的卓越工具。特别是&#xff0c;它的app.webhooks.post装饰器为处理实时Webhooks提供了一种简洁而强大的方法。在本文中&#xff0c;我们将探讨如何使用…

Python | python中的特殊方法__str__和__repr__

__str__和__repr__ 无方法有方法__str____repr__同时存在 __str__和__repr__都是更改print的输出形式 无方法 无特殊方法 class Person:def __init__(self,name,age):self.name nameself.age ageprint(Person(aa, 34))<main.Person object at 0x000002231EF78B38> …

【数据结构初阶】顺序结构二叉树(堆)接口实现超详解

文章目录 1.树1. 1 树的概念与结构1. 2 树的相关术语1. 3 树的表示1. 4 树形结构实际运用场景 2.二叉树2. 1 概念与结构2. 2 特殊的二叉树2. 2. 1 满二叉树2. 2. 2 完全二叉树 2. 3 二叉树存储结构2. 3. 1 顺序结构2. 3. 2 链式结构 3. 实现顺序结构二叉树&#xff08;小堆&…

麦肯锡的金字塔原理:越简单,越高效

分享下金字塔原理&#xff0c;它由麦肯锡公司的芭芭拉明托在《金字塔原理》一书中首次提出&#xff0c;旨在帮助人们通过结构化的思维分析问题&#xff0c;思考问题和解决问题。它是一种方法&#xff0c;也是一种思想。 总的来说&#xff0c;金字塔原理就是将事情归纳出一个中…

[C++进阶]AVL树

前面我们说了二叉搜索树在极端条件下时间复杂度为O(n),本篇我们将介绍一种对二叉搜索树进行改进的树——AVL树 一、AVL 树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找效率低下。因此&#xff0c;两位…

随着访问范围的扩大 OpenAI o1-mini 现已向免费用户开放

上周&#xff0c;OpenAI 展示了其最新的大型语言模型&#xff08;LLM&#xff09;–OpenAI o1及其小兄弟 OpenAI o1-mini。该公司在公告中称&#xff0c;Plus 和 Team 用户可在公告发布之日起访问该模型。企业和教育用户将在本周获得该模型&#xff0c;而免费用户最终将获得 o1…

算法题总结(一)——二分查找专题

二分查找 我们二分查找的本质就是每次能够通过中间值来进行分割&#xff0c;能够比较判断&#xff0c;查找到或者接近需要的数据&#xff0c;然后把一部分的数据丢弃掉。 原题 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &…

一键更换软件源的工具——chsrc

前言 经常用pip&#xff0c;ubuntu的apt&#xff0c;或者centos的yum等包下载工具的人不可避免的一件事就是——“更换软件源”&#xff0c;因为以上三个包下载工具的软件源一般都是默认为国外的官方网站&#xff0c;由于国情问题&#xff0c;下载速度就会非常慢&#xff0c;所…

【Linux】生产者消费者模型:基于阻塞队列,使用互斥锁和条件变量维护互斥与同步关系

目录 一、什么是生产者消费者模型 二、为什么要引入生产者消费者模型&#xff1f; 三、详解生产者消费者模型 ​编辑 生产者和生产者、消费者和消费者、生产者和消费者&#xff0c;它们之间为什么会存在互斥关系&#xff1f; 生产者和消费者之间为什么会存在同步关系&…

Flet全平台开发:软件开发界勇士为Python语言补短板的一次极具挑战性的尝试、冲刺和华丽亮相

一、Flet创始人和开发者介绍、开发Flet的背景介绍 Flet 的创始人和开发者 Feodor Fitsner 是俄罗斯人&#xff0c;就职于微软。 Flet 的第一个版本于 2022 年 6 月发布。这是一个相对较新的库&#xff0c;它基于 Flutter 框架&#xff0c;首先支持的是用 Python 语言开发软件…