力扣611题 有效三角形的个数 双指针算法

611. 有效三角形的个数

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

示例 1:

输⼊: nums = [2,2,3,4]

输出: 3

解释:有效的组合是:

2,3,4 (使⽤第⼀个 2)

2,3,4 (使⽤第⼆个 2)

2,2,3

⽰例 2:

输⼊: nums = [4,2,3,4]

输出: 4

解释:

4,2,3

4,2,4

4,3,4

2,3,4

补充

给我们三个数, 判断是否能构成三角形?

需要满⾜任意两边之和要⼤于第三边。但是实际上只需让较⼩的两条边之和⼤于第三边即可。

若a<=b<=c, 那么只需要判断一次a + b > c, 如果true, 那么可以构成; 反之则不能构成.

解法一: 暴力解法

暴力枚举所有三个数的组合, 然后判断a + b > c && a + c > b && b + c > a

for(i = 0; i < n; i++) {for(j = i + 1; j < n; j++) {for(k = j + 1; k < n; k++) {check(i, j, k);}}
}

时间复杂度: O(N3) 空间复杂度: O(1)

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

先对数组进行排序

根据判断三角形的优化方法, 我们可以固定一个最长边, 然后在比这条边小的有序数组中找出一个二元组, 使这个二元组之和大于这个最长边. 由于数组是有序的, 所以我们可以使用"对撞指针来优化"

设最长边枚举到i位置, 区间[left, right]i左边的区间, 也就是比它小的区间

在这里插入图片描述

  • 如果nums[left] + nums[right] > nums[i]:

    • 就说明[left, right - 1]区间上的所有元素与nums[right]构成的二元组之和都大于nums[i]
    • 满足构成三角形条件的一共有right - left
    • 此时right位置的元素所有情况都考虑完了, right--, 进入下一轮判断

    在这里插入图片描述

  • 如果nums[left] + nums[right] <= nums[i]:

    • 就说明[left + 1, right]区间上所有的元素与nums[left]构成的二元组之和都小于等于nums[i]
    • 此时left位置的元素都考虑完了, left--, 进入下一轮循环

    在这里插入图片描述

Java代码

class Solution {public int triangleNumber(int[] nums) {Arrays.sort(nums);int count = 0;//固定最大的数for(int i = nums.length - 1; i > 1; i--) {int left = 0;int right = i - 1;while(right > left) {if(nums[left] + nums[right] > nums[i]) {count += right - left;right--;} else {left++;}}}return count;}
}

时间复杂度O(N2), 空间复杂度O(log2N)(快排占用的空间)

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

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

相关文章

带你用uniapp从零开发一个仿小米商场_10.开发一个占剩余窗口的滚动区域

首先是一个头部的tag切换栏,这个很简单,就不多说 源码奉上 <scroll-view scroll-x class"border scroll-row" style"height: 80rpx;"><view class"scroll-row-item" style"height: 80rpx;line-height: 80rpx;" v-for"(…

使用MD5当做文件的唯一标识,这样安全么?

使用MD5作为文件唯一标识符可靠么&#xff1f; 文章目录 使用MD5作为文件唯一标识符可靠么&#xff1f;什么是MD5&#xff1f;MD5的用途MD5作为文件唯一标识的优劣优势劣势 使用MD5作为文件唯一标识的建议其他文件标识算法结束语 什么是MD5&#xff1f; MD5&#xff08;Messag…

CentOS或RHEL安装vscode

下载rpm安装包 网络下载或者下载到本地再上传到服务器&#xff0c;点击访问国内下载地址&#xff0c;不需要积分curl -fOL https://github.com/coder/code-server/releases/download/v4.19.1/code-server-4.19.1-amd64.rpm安装 rpm -i code-server-4.19.1-amd64.rpm关闭和禁用…

LORA概述: 大语言模型的低阶适应

LORA概述: 大语言模型的低阶适应 LORA: 大语言模型的低阶适应前言摘要论文十问实验RoBERTaDeBERTaGPT-2GPT-3 结论代码调用 LORA: 大语言模型的低阶适应 前言 LoRA的核心思想在于优化预训练语言模型的微调过程&#xff0c;通过有效地处理权重矩阵的变化&#xff08;即梯度更新…

SQL面试题,判断if的实战应用

有如下表&#xff0c;请对这张表显示那些学生的成绩为及格&#xff0c;那些为不及格 1、创建表&#xff0c;插入数据 CREATE TABLE chapter8 (id VARCHAR(255) NULL,name VARCHAR(255) NULL,class VARCHAR(255) NULL,score VARCHAR(255) NULL );INSERT INTO chapter8 (id, n…

从自动化、数字化到智能化,鸿蒙与制造业的双向奔赴

终端万物互联&#xff0c;商业竞争瞬息万变&#xff0c;制造企业面临着数字化转型与产品智能化升级的双重考验。鸿蒙操作系统以统一操作系统方案&#xff0c;可以为制造企业解决设备生态碎片化以及跨终端对接问题&#xff0c;提供安全性、流畅度、多屏协同等功能&#xff0c;实…

【紫光同创PCIE教程】——DMA读写/PIO内存读写TLP解析

本原创教程由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;http://www.meyesemi.com) 一&#xff1a;PIO内存读写操作TLP解析 PCIE有三种空间——内存空间、IO空间、配置空间&#xff0c;其中内存空…

支持Upsert、Kafka Connector、集成Airbyte,Milvus助力高效数据流处理

Milvus 已支持 Upsert、 Kafka Connector、Airbyte&#xff01; 在上周的文章中《登陆 Azure、发布新版本……Zilliz 昨夜今晨发生了什么&#xff1f;》&#xff0c;我们已经透露过 Milvus&#xff08;Zilliz Cloud&#xff09;为提高数据流处理效率&#xff0c; 先后支持了 Up…

选择排序,基础但你在面试很容易忽略的问题!

选择排序(Selection sort)是一种简单直观的排序算法。 第一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后再从剩余的未排序元素中寻找到最小&#xff08;大&#xff09;元素&#xff0c;然后放到…

Docker 使用心得

创建一个docker 镜像&#xff0c;相关运行代码&#xff0c;放在docker镜像文件同级&#xff0c; pm2 不能与 docker一起使用&#xff08;&#xff09; # node 服务docker FROM node:10.16.3LABEL author"sj"RUN mkdir -p /var/nodeCOPY ./node /var/nodeWORKDIR /va…

【每日一题】2661. 找出叠涂元素-2023.12.1

题目&#xff1a; 2661. 找出叠涂元素 给你一个下标从 0 开始的整数数组 arr 和一个 m x n 的整数 矩阵 mat 。arr 和 mat 都包含范围 [1&#xff0c;m * n] 内的 所有 整数。 从下标 0 开始遍历 arr 中的每个下标 i &#xff0c;并将包含整数 arr[i] 的 mat 单元格涂色。 …

如何解决SSL证书部署后未生效或网站显示不安全

本文介绍SSL证书部署后未生效或网站显示不安全的排查方法。 浏览器提示“您与此网站建立的连接不安全” 浏览器提示“无法访问此页面” 浏览器提示“这可能是因为站点使用过期或者不全的TLS安全设置” 浏览器提示“此页面上部分内容不安全&#xff08;例如图像&#xff09;”…