【Java 优选算法】双指针(下)
欢迎关注个人主页:逸狼
创造不易,可以点点赞吗~
如有错误,欢迎指出~
有效三角形的个数
题目链接
解法
解法1:暴力枚举--->O(n^3)
解法2:利用单调性,使用双指针来解决---->O(n^2)
- 优化:对整个数组进行排序
- 先固定最大数
- 在最大数的左区间内,使用双指针算法,快速统计出符合要求的个数
统计分为两种情况:
- 能构成三角形的 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)
解法二:排序+双指针
- 排序
- 固定一个数a
- 在该数后面的区间内,利用"双指针算法"快速找到两个数的和等于 -a即可
处理细节问题:
- 去重
- 找到一种结果后,left和right指针要跳过重复的元素,
- 当使用完一次双指针算法之后,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: 排序 + 双指针(主要利用"三数之和"(上一题)的思路)
- 依次固定一个数a;
- 在a后面的区间内,利用"三数之和" 找到三个数,是这三个数等于target-a即可
- 依次固定一个数b
- 在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;}
}
相关文章:
【Java 优选算法】双指针(下)
欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 有效三角形的个数 题目链接 解法 解法1:暴力枚举--->O(n^3) 解法2:利用单调性,使用双指针来解决---->O(n^2) 优化:对整个数组进行排序先固定最大数在最大数的左…...
动态规划:07.路径问题_珠宝的最大价值_C++
题目链接:LCR 166. 珠宝的最高价值 - 力扣(LeetCode)https://leetcode.cn/problems/li-wu-de-zui-da-jie-zhi-lcof/description/ 一、题目解析 题目: 解析: 有过做前几道题的经验,我们会发现这道题其实就…...
COMDEL电源CX2500S RF13.56MHZ RF GENERATOR手侧
COMDEL电源CX2500S RF13.56MHZ RF GENERATOR手侧...
GPU加速生物信息分析的尝试
GPU工具分类 实话实说,暂时只有英伟达的GPU才能实现比较方便的基因组分析集成化解决方案,其他卡还需要努力呀,或者需要商业公司或学术团体的努力开发呀!FPGA等这种专用卡的解决方案也是有的,比如某测序仪厂家…...
【零散技术】详解Odoo17邮件发送(一)
序言:时间是我们最宝贵的财富,珍惜手上的每个时分 Odoo的邮件功能十分强大,在非常多的场景中可以看见其应用,例如原生的用户邀请,报价单发送,询价单发送等等.... 那么抛开原生自带的功能,我们如何巧妙的通过代码进行自…...
函数题 6-5 求自定类型元素的最大值【PAT】
文章目录 题目函数接口定义裁判测试程序样例输入样例输出样例 题解解题思路完整代码AC代码 编程练习题目集目录 题目 要求实现一个函数,求N个集合元素S[]中的最大值,其中集合元素的类型为自定义的ElementType。 函数接口定义 ElementType Max( Element…...
Python---爬虫
文章目录 目录 前言 一.Http请求/响应模块 requests模块 二.文本筛选模块 re模块 XPath模块 XPath 路径表达式 XPath 语法元素 三. 爬虫模板 爬虫案例 前言 Python爬虫是一种通过自动化程序爬取互联网上的信息的技术。爬虫可以自动访问网页并提取所需的数据,比…...
设计模式之组合设计模式
一、组合设计模式概念 组合模式 (Component) 是一种结构型设计模式,将对象组合成树形结构以表示“部分-整体”的层次结构。 组合模式使得用户对单个对象和组合对象的使用具有唯一性。 适用场景 想要表示对象的部分-整体层次结构。想要客户端忽略组合对象与单个对象的…...
Java汽车销售管理
技术架构: springboot mybatis Mysql5.7 vue2 npm node 有需要该项目的小伙伴可以添加我Q:598748873,备注:CSDN 功能描述: 针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、财务报表等功能&…...
js TypeError: Cannot read property ‘initialize’ of undefined
js TypeError: Cannot read property ‘initialize’ of undefined 在JavaScript开发旅程中,遇到TypeError: Cannot read property ‘initialize’ of undefined这样的错误提示,无疑是令人沮丧的。这个错误通常意味着你试图访问一个未定义对象的initiali…...
【Motion Forecasting】【摘要阅读】BANet: Motion Forecasting with Boundary Aware Network
BANet: Motion Forecasting with Boundary Aware Network 这项工作发布于2022年,作者团队来自于OPPO。这项工作一直被放在arxiv上,并没有被正式发表,所提出的方法BANet在2022年达到了Argoverse 2 test dataset上的SOTA水准。 Method BANet…...
Cpp快速入门语法(下)(2)
文章目录 前言一、函数重载概念与使用C为何支持函数重载? 二、引用概念语法特性权限(常引用)使用场景与指针的区别 三、内联函数四、auto关键字(C11)五、基于范围的for循环(C11)六、指针空值nullptr(C11)总结 前言 承前启后,正文开始! 一、函…...
【GO开发】MacOS上搭建GO的基础环境-Hello World
文章目录 一、引言二、安装Go语言三、配置环境变量(可跳过)四、Hello World五、总结 一、引言 Go语言(Golang)因其简洁、高效、并发性强等特点,受到了越来越多开发者的喜爱。本文将带你一步步在Mac操作系统上搭建Go语…...
探索轻量级语言模型 GPT-4O-mini 的无限可能
随着人工智能技术的日益发展,语言模型正逐渐成为人们日常生活和工作中不可或缺的一部分。其中,GPT-4O-mini 作为一个轻量级大模型,以其强大的功能和易用性吸引了众多关注。本文将带您了解 GPT-4O-mini 的出色表现、应用场景以及如何免费使用这…...
CSS 笔记 1
1. CSS 优先级, 内部大于外部。 2. 几个属性: flex-grow: 1; 让 当前元素 在剩余空间中, 占据尽可能多的高度,确保它能在中间居中。 max-height: 300px; 限制最大高度 300 像素, flex-grow: 1; 导致占的太满了&#x…...
2024/9/16 dataloader、tensorboard、transform
一、pytorch两大法宝元素 假设有一个名为pytorch的包 dir():用于打开包,看里面的内容 help():用于查看具体的内容的用处 二、python文件,python控制台和jupyter的使用对比 三、pytorch读取数据 pytorch读取数据主要涉及到两个类࿱…...
C/C++语言基础--从C到C++的不同(下),15个部分说明C与C++的不同
本专栏目的 更新C/C的基础语法,包括C的一些新特性 前言 1-10在上篇C/C语言基础–从C到C的不同(上);当然C和C的不同还有很多,本人暂时只总结这些,其他的慢慢更新;上一篇C/C语言基础–从C到C的不同(上&…...
物理感知扩散的 3D 分子生成模型 - PIDiff 评测
PIDiff 是一个针对蛋白质口袋特异性的、物理感知扩散的 3D 分子生成模型,通过考虑蛋白质-配体结合的物理化学原理来生成分子,在原理上,生成的分子可以实现蛋白-小分子的自由能最小。 一、背景介绍 PIDiff 来源于延世大学计算机科学系的 Sang…...
蓝桥杯-基于STM32G432RBT6的LCD进阶(LCD界面切换以及高亮显示界面)
目录 一、页面切换内容详解 1.逻辑解释 2.代码详解 code.c(内含详细讲解) code.h main.c 3.效果图片展示 编辑 二、页面选项高亮内容详解 1.逻辑解释 2.读入数据 FIRST.第一种高亮类型 code.c(内含代码详解) code.…...
2022高教社杯全国大学生数学建模竞赛C题 问题一(1) Python代码
目录 问题 11.1 对这些玻璃文物的表面风化与其玻璃类型、纹饰和颜色的关系进行分析数据探索 -- 单个分类变量的绘图树形图条形图扇形图雷达图 Cramer’s V 相关分析统计检验列联表分析卡方检验Fisher检验 绘图堆积条形图分组条形图 分类模型Logistic回归随机森林 import matplo…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...

