有效三角形的个数 ---- 双指针

题目链接

题目:

分析:

  • 这道题的意思就是将数组的元素, 拿出三个数, 能构成三角形就是有效的
  • 判断是否能构成三角形的条件: 两边之和大于第三边, 我们只需找到三个数中最小的两个数之和是否大于第三边, 大于则可以构成三角形
  • 解法一: 暴力解法, 即找到所有的三元组, 并挨个判断, 但效率低时间复杂度高
  • 解法二:
    • 为了更快的找到三元组, 我们可以先对数组进行排序
    • 我们先假设最大的数为第三边c, 两边中的一边是最小的数a,  一边是除了最大数c的最大数b
    • 如果a+b>c, 能构成三角形, 此时, a和b中间的数都比a大, 那么这些数加上b, 一定也是>c的, 那么a+b再小一点是否可以呢? 即 将b减小1, 即向左移动1, 再次判断
    • 如果a+b<=c, 不能构成三角形, 那么a+b再大一点是否可以呢? 即将a增加1, 即向右移动1, 再次判断
    • 直到ab相遇, 说明与最大值c的组合已全部找完了, 下面要找第二大的数字的组合, 即c向左移动1, 再次循环找ab
  • 总结:想要最大最小数, 或进行运算时, 考虑先对数组排序, 再使用左右指针按需计算

思想:

  1. 先对数组进行排序
  2. 定义一个n记录有效三角形的个数
  3. 定义c 指向最大的数, left为最左边, right为c的左边一个
  4. c从最后不断向前, 循环判断left+right 和c 的大小, 直到left和right相遇
    1. 如果left+right > c, n+=right-left, right--
    2. 如果left+right < c, left++

 代码:

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

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

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

相关文章

X86与FPGA相结合,基于PIB的AI开发——人体姿态识别

人体姿态估计是计算机视觉领域中用于理解和分析人类行为的一个关键技术。它主要涉及到检测和识别图像或视频中人体的各个关键点&#xff0c;并预测这些关键点之间的空间关系&#xff0c;从而构建出人体的骨架模型。 本文将介绍基于PIB板的人体姿态估计案例。这是一个交互式的实…

携手知名学府 平安人寿升级推出“财富康养保险规划师”培养项目 赋能代理人队伍高质转型

为响应监管要求、顺应行业趋势、满足市场需求,近日,平安人寿携手清华大学、北京大学两学府,升级推出 “平安人寿财富康养保险规划师”培养项目,为保险代理人提供兼具独特性、权威性与实战性的培训课程及能力评价,助力队伍专业能力、职业素养和社会形象提升,助推行业高质量发展。…

Kotlin语法入门-数据类、伴生类、枚举类(9)

Kotlin语法入门-数据类、伴生类、枚举类(9) 文章目录 Kotlin语法入门-数据类、伴生类、枚举类(9)九、数据类、伴生类、枚举类1、数据类2、伴生类2.1、定义伴生类2.2、JvmStatic注解2.3、const关键字 3、枚举类3.1、定义3.2、传参3.3、继承与实现 九、数据类、伴生类、枚举类 1…

适用于Windows和Mac的十大误删除数据恢复软件

数据恢复是从辅助存储或可移动文件中找回丢失、删除或损坏的数据的过程。数据丢失的原因有很多。因此&#xff0c;有必要恢复已删除的数据。有各种可用的软件工具&#xff0c;使用户能够恢复任何类型的已删除数据。但是&#xff0c;任何数据恢复都有四个主要阶段。他们正在修复…

【C 数据结构】普通树

文章目录 【 1. 树的双亲表示法 】【 2. 树的孩子表示法 】【 3. 树的孩子兄弟表示法 】 前面学了二叉树的存储结构&#xff0c;本节学习如何存储具有普通树结构的数据。例如下图所示为普通树存储结构。 通常&#xff0c;存储具有普通树结构数据的方法有 3 种&#xff1a; 双…

Linux红帽(RHCE)认证学习笔记-(1)Linux 文件管理

Linux 文件管理 1. Linux下的目录结构 / 是Linux里的根目录 Linux的一级目录 /boot &#xff1a;存放的是系统的启动配置⽂件和内核⽂件/dev &#xff1a;存放的是Linux的设备⽂件/etc&#xff1a;存放的是Linux下的配置文件/home&#xff1a;存放普通用户的家目录/media&am…

学习java第五十三天

Spring器中的bean可以分为5个范围&#xff1a; singleton&#xff1a;这种bean范围是默认的&#xff0c;这种范围确保不管接受多少请求&#xff0c;每个容器中只有一个bean的实例&#xff0c;单例模式&#xff1b; prototype&#xff1a;为每一个bean提供一个实例&#xff1b…

Ubuntu 系统使用 root 用户登录

Ubuntu 系统在安装过程中默认不设置 root 帐户和密码。如有需要&#xff0c;可在设置中开启允许 root 用户登录。具体操作步骤如下&#xff1a; 1.使用 ubuntu 帐户登录服务器 2.执行以下命令&#xff0c;设置 root 密码 sudo passwd root 3.输入 root 的密码&#xff0c;按…

NDK 基础(一)—— C 语言知识汇总

本系列文章主要是介绍一些 NDK 开发所需的基础知识&#xff0c;目录如下&#xff1a; NDK 基础&#xff08;一&#xff09;—— C 语言知识汇总 NDK 基础&#xff08;二&#xff09;—— C 语言基础与特性1 NDK 基础&#xff08;三&#xff09;—— C 语言基础与特性2 NDK 基础…

C++生产者消费者问题实例

C生产者消费者问题实例 全局变量声明生产者生产函数消费者消费函数生产者线程入口消费者线程入口主函数 全局变量声明 #include <iostream> #include <condition_variable> #include <mutex> #include <thread>static const int repository_size 10;/…

android 内部序列化对象

在Android中&#xff0c;内部序列化对象通常指的是将对象的状态转换为字节流&#xff0c;以便可以将对象保存到文件、通过网络发送&#xff0c;或者在应用的不同部分之间传递。在Java中&#xff0c;序列化是通过实现java.io.Serializable接口来完成的。Android继承了Java的序列…

MF(推荐系统的矩阵分解技术)论文笔记

论文概述 推荐系统的矩阵分解技术可以为用户提供更为准确的个性化推荐&#xff0c;对比传统的近邻技术&#xff0c;矩阵分解技术可以纳入更多信息&#xff0c;如隐式反馈、时间效应和置信度 近邻技术&#xff1a;基于用户或物品之间的相似性进行推荐&#xff0c;当用户之间已…

ChatGPT4.0知识问答、DALL-E生成AI图片、Code Copilot辅助编程,打开新世界的大门

目录 1、DALL-E 文字转图片 在线AI修改2、Write For Me3、Code Copilot 目前最强的AI编程大模型4、Diagrams: Show Me5、Instant Website [Multipage] 网站合成神器6、AskYourPDF Research Assistant 无限PDF7、Diagrams & Data: Research, Analyze, Visualize 精读Excel …

【注解和反射】获取类运行时结构

继上一篇博客【注解和反射】类加载器-CSDN博客 目录 七、获取类运行时结构 测试 getFields()和getDeclaredFields() getMethods()和getDeclaredMethods() 七、获取类运行时结构 获取类运行时结构通常指的是在Java等面向对象编程语言中&#xff0c;使用反射&#xff08;Ref…

迁移学习基础知识

简介 使用迁移学习的优势&#xff1a; 1、能够快速的训练出一个理想的结果 2、当数据集较小时也能训练出理想的效果。 注意&#xff1a;在使用别人预训练的参数模型时&#xff0c;要注意别人的预处理方式。 原理&#xff1a; 对于浅层的网络结构&#xff0c;他们学习到的…

leetcode_29.两数相除

29. 两数相除 题目描述&#xff1a;给你两个整数&#xff0c;被除数 dividend 和除数 divisor。将两数相除&#xff0c;要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断&#xff0c;也就是截去&#xff08;truncate&#xff09;其小数部分。例如&#xff0c;8.345 将…

[Swift]单元测试

编写单元测试是确保你的代码质量和功能正确性的重要步骤 一、编写单元测试的详细流程 1. 创建一个新的Xcode项目 如果你尚未创建一个项目&#xff0c;首先你需要在Xcode中创建一个新的iOS项目&#xff1a; 打开Xcode&#xff0c;选择“File” > “New” > “Project”…

window驱动开发-内核线程

在内核开发中&#xff0c;不可避免需要用到多线程技术&#xff0c;毕竟驱动是针对所有进程&#xff0c;而非某个特定进程&#xff0c;故驱动自然也是多线程的。在设计目标中&#xff0c;已经明确了驱动例程设计中&#xff0c;需要考虑的问题之一就是"重入"的概念&…

重生之我是Nginx服务专家

nginx服务访问页面白色 问题描述 访问一个域名服务返回页面空白&#xff0c;非响应404。报错如下图。 排查问题 域名解析正常&#xff0c;网络通讯正常&#xff0c;绕过解析地址访问源站IP地址端口访问正常&#xff0c;nginx无异常报错。 在打开文件时&#xff0c;发现无法…

R可视化:ggplot2绘制双y轴图

介绍 ggplot2绘制双y轴图加载R包 knitr::opts_chunk$set(message = FALSE, warning = FALSE) library(tidyverse) library(readxl)# rm(list = ls()) options(stringsAsFactors = F) options(future.globals.maxSize = 10000 * 1024^2)Importing data 下载Underdetection of c…