Java【手撕双指针】LeetCode 611. “有效三角形个数“, 图文详解思路分析 + 代码

news2025/1/13 13:15:55

文章目录

  • 前言
  • 一、有效三角形个数
    • 1, 题目
    • 2, 思路分析
    • 1, 从左往右 or 从右往左?
    • 3, 代码展示


前言

各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)

一、有效三角形个数

1, 题目

OJ链接

其实这题本质也是查找, 而查找的本质是排除 ! ! 查找的本质是排除 ! ! 查找的本质是排除 ! !


2, 思路分析

最简单的暴力枚举 : 三层 for 循环, 从先固定两个数, 再依次遍历第三个数, 判断这三个数是否能组成三角形, 时间复杂度为O(N³), 会超出时间限制

既然暴力枚举不行, 那尝试就使用双指针, 但我们要找三个数, 只能先固定一个数, 在剩余区间上, 使用双指针(left和right) 找到另外两个数, 尽可能让双指针找全所有正确组合

根据实际情况分析选择对撞双指针还是快慢双指针, 本题要求在数组中"查找", 那么使用对撞双指针能很大程度上提高效率

而且刚才标注了一句话 : 查找的本质是排除, 查找的本质是排除, 查找的本质是排除 ! ! !

如果每次判断, 都能尽可能多的排除数据, 就能尽可能地提高效率

本题有两种基本思路 :

  • 1, 定义 i 指针, 先固定较小的数, 剩余区间使用双指针, i 从左往右遍历

  • 2, 定义 i 指针, 先固定较大的数, 剩余区间使用双指针, i 从右往左遍历


1, 从左往右 or 从右往左?

在正式开始之前, 需要对原数组进行排序, 这是常见的作法, 因为一般数组有序时, 成单调性, 能够更高效的进行"排除"

定义变量 count 表示找到有效三角形的个数

在这里插入图片描述

count = right(6下标) - left(4下标)[图中画错了] 这行代码表示 : left 不需要再向右遍历了, 已经找到了3, 8, 103, 9, 10 这两个有效三角形了, right - left 的值就是 i 为 0 下标, right 为 6 下标时有效三角形的个数, 下面的示例同理

在这里插入图片描述


上述两种遍历的方式, 其实应该选择让 i 先固定最大值, 从右往左遍历, 因为第一种方式, 无法让 right 移动, 也就是说, 不能实现真正 “对撞” 双指针

在这里插入图片描述

  • 让 i 固定最小值, 从左往右遍历, 会导致 left 在向右遍历时, 虽然也能实现排除(省略不必要的遍历), 但由于 right 无法向左遍历, 会跨过一部分正确的组合, 要想找全遗漏的正确的组合, 就得让 right 向左遍历, 而 left 也必须回到 i + 1 的位置重新向右遍历(因为 left 已经向右移动很多了), 这样其实相当于暴力枚举
  • 让 i 固定最大值, 从右往左遍历, 既能让 left 向右遍历, 也能让 right 向左遍历, 所以能找全所有的正确组合, 而且排除(省略不必要的遍历)效率很高

3, 代码展示

	public int maxArea(int[] height) {
         public int triangleNumber(int[] nums) {
        // 1, 从左往右先固定一个数
        // 2, 剩下两个数在剩余区间内, 对撞指针
        Arrays.sort(nums);
        int i =  0;
        int count = 0;
        while(i <  nums.length - 2) {
            int left = i + 1;
            int right = nums.length - 1;
            while(left < right) {
                if(nums[i] + nums[left] > nums[right]){
                    count += right - left; // 利用单调性快速寻找
                    right--;
                }else{
                    left++;
                }
            }
            i++;
        }
        return count;
    }  

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

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

相关文章

一文了解Gin对Cookie的支持z

1. 引言 本文将从Web应用程序处理请求时需要用户信息&#xff0c;同时HTTP又是无状态协议这个矛盾点出发。从该问题出发&#xff0c;简单描述了解决该问题的Token 机制&#xff0c;进而引出Cookie的实现方案。 基于此我们将详细描述Cookie的规范&#xff0c;然后详细描述具体…

UE4如何连接dmx---摇头矩阵灯具的创建

UE4如何连接dmx---摇头矩阵灯具的创建 开始创建库&#xff01; 然后我们开始创建多少个灯珠&#xff08;注意了&#xff1a;这是矩阵灯&#xff0c;是看灯珠的&#xff09; 那么这里我们创建6X6灯珠 下面设置灯珠的属性&#xff0c;灯珠有什么属性呢&#xff0c;只有颜色属性&…

高忆管理:沪指震荡跌0.24%,医药、酿酒等板块走低,数据要素概念逆市活跃

22日早盘&#xff0c;两市股指高开低走&#xff0c;沪指盘中冲高回落&#xff0c;创业板指走势疲弱&#xff1b;北向资金净卖出超40亿元。 到午间收盘&#xff0c;沪指跌0.24%报3085.48点&#xff0c;深成指跌0.73%&#xff0c;创业板指跌1.3%&#xff1b;两市合计成交4510亿元…

Python 自定义装饰器与上下文管理

1、定义装饰器实现计算函数运行时间 # 自定义装饰器 def compute_time(func):def compute(*args, **kwargs):st time.time()result func(*args, **kwargs)et time.time()print(消费时间 %.6f s % (et - st))return resultreturn compute# 使用 compute_time def work(work_i…

(2018,解释可视化)GAN 解剖:可视化和理解生成对抗网络

GAN dissection: Visualizing and understanding generative adversarial networks 公众号&#xff1a;EDPJ 目录 0. 摘要 1. 简介 2. 相关工作 3. 方法 3.1 通过解剖表征单元 3.2 使用干预措施衡量因果关系 4. 结果 4.1 跨数据集、层和模型的单位比较 4.2 诊断和改…

VMware 使用U盘进入PE系统,下划线光标闪烁

一、前言 vmware虚拟机各种原因崩溃&#xff0c;然后又没有快照&#xff0c;怎么办&#xff1f; 或者 密码忘记了无法开机&#xff0c;这时候就想到使用PE了。 二、分析 但是使用U盘进入PE的时候&#xff0c;遇到了各种问题&#xff1a; 加载U盘修改启动顺序启动后出现下划线…

DiscuzQ 二开教程(7)——二次开发版本部署文档

DiscuzQ 二开教程&#xff08;7&#xff09;——二次开发版本部署文档 源码&#xff1a;Discuz-Q-V3: 本仓库为Discuz-Q V3.0.211111 版本的二次开发版本&#xff0c;是将DiscuzQ官方仓库进行合并代码&#xff08;All in One&#xff09;整理后的仓库&#xff0c;使用更方便。…

【2023年11月第四版教材】《第6章-项目管理概论》(合集篇)

《第6章-项目管理概论》 1 章节内容2 项目基础3 项目经理的角色3.1 项目经理的影响力范围3.2 项目经理领导力风格 4 价值驱动的项目管理知识体系4.1 开发生命周期类型 5 五大过程组6 五个过程组和十大知识领域 1 章节内容 【本章分值预测】大部分为新增内容&#xff0c;预计选…

ARL资产侦察灯塔 指纹增强

项目&#xff1a;https://github.com/loecho-sec/ARL-Finger-ADD 下载项目后运行 python3 ARl-Finger-ADD.py https://你的vpsIP:5003/ admin password该项目中的finger.json可以自己找到其他的指纹完善&#xff0c;然后运行脚本添加指纹。

微信开发之一键修改群聊备注的技术实现

修改群备注 修改群名备注后&#xff0c;如看到群备注未更改&#xff0c;是手机缓存问题&#xff0c;可以连续点击进入其他群&#xff0c;在点击进入修改的群&#xff0c;再返回即可看到修改后的群备注名&#xff0c;群名称的备注仅自己可见 请求URL&#xff1a; http://域名地…

Python采集电商平台泳衣数据进行可视化分析

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: python 3.8 解释器 pycharm 编辑器 模块使用: 第三方模块 需要安装 requests —> 发送 HTTP请求 内置模块 不需要安装 csv —> 数据处理中经常会用到的一种文件格式 第三方模块安装&#xff1a…

高性能服务器Nodejs快速入门

目录 1 初识 Nodejs2 Buffer 缓冲区3 fs 文件系统模块3.1 读取文件3.2 写入文件3.3 路径动态拼接问题 __dirname3.4 其它操作 4 path 路径模块4.1 路径拼接 path.join()4.2 获取路径中文件名 path.basename()4.3 获取路径中文件扩展名 path.extname() 5 http 模块5.1 创建基本 …

2023年高教社杯数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 描述 …

Prompt本质解密及Evaluation实战(一)

一、基于evaluation的prompt使用解析 基于大模型的应用评估与传统应用程序的评估不太一样&#xff0c;特别是基于GPT系列或者生成式语言模型&#xff0c;因为模型生成的内容与传统意义上所说的内容或者标签不太一样。 以下是借用了ChatGPT官方的evaluation指南提出的对结果的具…

Http2.0协议深入解析

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

ChatGPT、Google Bard、Claude2、新BING哪一款人工智能聊天机器人适合自己

人工智能聊天机器人正在提高数无数专业人士的工作效率。下面我们就来看看目前最流行的几款强大的人工智能工具&#xff0c;以及它们具体如何帮助到你。 今年7月AI圈最大的动静之一便是AI初创公司Anthropic发布了其AI聊天机器人Claude最新版本——Claude2。该聊天机器人对标Open…

AP9235 dc-dc升压恒流电源驱动IC 2000ma SOT23-6

概述 AP9235B 系列是一款固定振荡频率、恒流输出的升压型DC/DC转换器&#xff0c;非常适合于移动电话、PDA、数码相机等电子产品的背光驱动。输出电压可达30V &#xff0c;3.2V输入电压可以驱动六个串联LED&#xff0c; 2.5V输入电压可以驱动两路并联LED&#xff08;每路串联…

机器学习简介

文章目录 引言1. 从找规律说起2. 机器学习应用2.1 有监督学习2.2 无监督学习2.2.1 聚类2.2.2 降维 3. 机器学习一般流程4. 机器学习常用概念5. 深度学习简介5.1 引入 -- 猜数字5.2 深度学习5.2.1 隐含层/中间层5.2.2 随机初始化5.2.3 损失函数5.2.4 导数与梯度5.2.5 梯度下降5.…

【linux kernel】linux内核中的debugfs

文章目录 一、&#x1f449;相关文件二、&#x1f449;简介三、&#x1f449;debugfs的API1、在debugfs中创建目录2、在debugfs目录中创建文件3、创建一个具有初始大小的文件4、创建包含单个整数值&#xff08;十进制&#xff09;的文件5、创建包含单个十六进制值得文件&#x…

AI Agent在家务场景下的AgentBench基准测试

近日,来自清华大学、俄亥俄州立大学和加州大学伯克利分校的研究者设计了一个测试工具——AgentBench,用于评估LLM在多维度开放式生成环境中的推理能力和决策能力。研究者对25个LLM进行了全面评估,包括基于API的商业模型和开源模型。 他们发现,顶级商业LLM在复杂环境中表现出…