有效三角形的个数【双指针】

在这里插入图片描述

1.优化版暴力求解

如果能构成三⻆形,需要满⾜任意两边之和要⼤于第三边。实际上只需让较⼩的两条边之和⼤于第三边即可。将原数组排序,从⼩到⼤枚举三元组,这样三层 for 循环枚举出的三元组只需判断较⼩的两条边之和是否⼤于第三边。

class Solution
{
public:int triangleNumber(vector<int> &nums){sort(nums.begin(), nums.end());int n = nums.size(), ret = 0;for (int i = 0; i < n; i++){for (int j = i + 1; j < n; j++){for (int k = j + 1; k < n; k++){if (nums[i] + nums[j] > nums[k])ret++;}}}return ret;}
};

2.排序+二分

在 [j+1,n−1] 的下标范围内使用二分查找,找出最大的满足 nums[k]<nums[i]+nums[j]的下标 k,在 [j+1,k] 范围内的下标都可以作为边 c 的下标,将该范围的长度 k−j 累加。在枚举a和b时出现了0,那么 nums[i] 一定为 0。边c需要满足c< nums[i]+ nums[j]= nums[j],而下标在[j+1,n-1]范围内的元素一定都是大于等于 nums[j]的,因此二分查找会失败。若二分查找失败,我们可以令k=j,此时对应的范围长度k-j=0,我们也就保证了答案的正确性。

class Solution
{
public:int triangleNumber(vector<int> &nums){int n = nums.size();sort(nums.begin(), nums.end());int ret = 0;for (int i = 0; i < n; ++i){for (int j = i + 1; j < n; ++j){int left = j + 1, right = n - 1, k = j;while (left <= right){int mid = (left + right) / 2;if (nums[mid] < nums[i] + nums[j]){k = mid;left = mid + 1;}else{right = mid - 1;}}ret += k - j;}}return ret;}
};

3.排序+双指针

此法是对上述两种方法的优化。
排序过后数组数据为递增排列。

首先我们先来看这样一个数学常识:

将一个递增排序的数组分为两部分:
在这里插入图片描述

  1. 如果此时有Left + Right > Max 那么
    Right + Right-1
    Right + Right-2
    Right + …
    Right + Left
    的值都大于Max。那么能够构成的二元组个数为right - left个
    此时 right 位置元素的所有情况相当于全部考虑完毕, right – ,进⼊下⼀轮判断
  2. 同上,如果 nums[left] + nums[right] <= nums[i] ,说明 left 位置的元素是不可能与 [left + 1, right] 位置上的元素构成满⾜条件的⼆元组,left 位置的元素可以舍去, left++ 进⼊下轮循环。

代码

class Solution
{
public:int triangleNumber(vector<int> &nums){sort(nums.begin(), nums.end());int ret = 0, n = nums.size();for (int cur = n - 1; cur >= 2; cur--){int left = 0, right = cur - 1;while (left < right){if (nums[left] + nums[right] > nums[cur]){ret += right - left;right--;}elseleft++;}}return ret;}
};

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

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

相关文章

Qt开发(2)——在已有VS项目中配置Qt

在之前的Qt开发学习中&#xff0c;基本都是在Qt Creator中创建一个Qt项目&#xff0c;或者即便是在VS中也是直接新建一个Qt项目。但很少有记录如何在已有的C项目中添加Qt,这就好比我有个项目已经开发完了&#xff0c;现在又说加个Qt界面的功能。这篇文章就是记录如何在已有项目…

那如何解决信创设配问题呢?怎么成为信创产品?

信创也好、国产化也好都是国家部署的重点工作&#xff0c;所有涉及到的相关行业和部门都必须坚持执行和并且要执行好的重点任务&#xff0c;这一点无容置疑。在信息化层面&#xff0c;随着我国基础水平&#xff08;芯片、OS、DB、中间件&#xff09;的提升&#xff0c;信创工作…

臻奶惠:无人售货奶柜,让纯净营养触手可及

臻奶惠&#xff1a;无人售货奶柜&#xff0c;让纯净营养触手可及 在这个快速发展的时代&#xff0c;每一个创新都在为生活带来便捷和品质的提升。臻奶惠深谙此道&#xff0c;特推出无人售货奶柜&#xff0c;将健康营养与现代科技完美融合&#xff0c;为您和家人提供24小时不间…

如何让笔记本电脑发挥120%的性能?原来还有这种小技巧

前言 现在的笔记本电脑性能真的是越来越好了&#xff01;但笔记本的CPU终究受到功耗的限制&#xff0c;与同代的台式机CPU性能相差不是一点半点的。 小白在之前很长一段时间也是使用着Windows系统的笔记本&#xff0c;也见过不下百款笔记本。 笔记本为了轻便&#xff0c;通常…

逐步学习Go-并发通道chan(channel)

概述 Go的Routines并发模型是基于CSP&#xff0c;如果你看过七周七并发&#xff0c;那么你应该了解。 什么是CSP&#xff1f; "Communicating Sequential Processes"&#xff08;CSP&#xff09;这个词组的含义来自其英文直译以及在计算机科学中的使用环境。 CSP…

SpringBoot整合Swagger-UI实现在线API文档

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:SpringBoot整合Swagger-UI实现在线API文档 📚个人知识库: Leo知识库,欢迎大…

CODEFORCES --- 750A. New Year and Hurry

750A. New Year and Hurry Limak将在2016的最后一天参加比赛。比赛将于 20&#xff1a;00 开始&#xff0c;持续四个小时&#xff0c;一直持续到午夜。将有 n 个问题&#xff0c;按难度排序&#xff0c;即问题 1 是最简单的&#xff0c;问题 n 是最难的。利马克知道他需要 5i分…

main.py(二)

这段代码首先检查配置文件中是否设置了保存 CSV 文件的选项&#xff08;SAVE_CSV为True&#xff09;&#xff0c;如果是&#xff0c;则执行以下操作&#xff1a; 定义了一个列表 header&#xff0c;包含了 CSV 文件的列名。在这个例子中&#xff0c;列名包括了 car_center_x、c…

深入理解nginx mp4流媒体模块[上]

目录 1. 引言2. 配置3. 源码分析3.1 配置指令3.1.1 mp43.1.2 mp4_buffer_size3.1.3 mp4_max_buffer_size3.1.4 mp4_start_key_frame 3.2 MP4的请求处理过程3.2.1 预处理3.2.2 找到并打开本地mp4文件3.2.3 解析请求参数3.2.4 MP4文件的处理 1. 引言 在当今数字化时代&#xff0c…

YOLOv9改进策略:卷积魔改 | DCNv2升级版本,助力检测

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;在DCN的基础上&#xff0c;增加了2个创新点&#xff0c;分别是调制模块和使用多个调制后的DCN模块&#xff0c;从形成了DCN的升级版本——DCNv2 &#x1f4a1;&#x1f4a1;&#x1f4a1;如何使用&#xff1a…

红岩思维导图的制作软件,分享4款热门的!

红岩思维导图的制作软件&#xff0c;分享4款热门的&#xff01; 在当今信息爆炸的时代&#xff0c;思维导图作为一种有效的知识整理和思维拓展工具&#xff0c;受到了广大用户的青睐。红岩思维导图以其独特的风格和实用性&#xff0c;成为了许多人学习和工作中的得力助手。那么…

JavaScript中的行为委托和面向类的区别?

先复习一些原型链的知识&#xff1a; [[Prototype]] 机制是一种存在于一个对象上的内部链接&#xff0c;它指向一个其他对象。 在JavaScript中&#xff0c;每个对象都有一个原型对象&#xff08;prototype&#xff09;&#xff0c;当访问对象的属性或方法时&#xff0c;如果对象…

【SpringSecurity】基础入门

目录 权限管理什么是权限管理认证授权权限管理解决方案Shiro开发者自定义Spring Security Spring Security特性Spring、Spring Boot 和 Spring Security 三者的关系整体架构1.认证AuthenticationManagerAuthenticationSecurityContextHolder 2.授权AccessDecisionManagerAccess…

作为数据分析师,如何能把AI工具和数据分析工作更好的结合?

在当今信息爆炸的时代&#xff0c;数据已经成为企业、研究机构乃至个人决策的重要依据。然而&#xff0c;如何高效地处理、分析和解读这些数据&#xff0c;从而提炼出有价值的信息&#xff0c;却成为了一个亟待解决的问题。 幸运的是&#xff0c;随着人工智能技术的飞速发展&a…

刷好题,固基础-2

7-5 运动会 T公司的员工层级关系可以表示成一棵树&#xff0c;员工X是员工Y的直接领导&#xff0c;则在树中X是Y的父结点。公司拟组织一场运动会&#xff0c;但为了避免尴尬&#xff0c;每个员工都不想与自己的直接领导一起参赛。假定每个员工都对应一个权重&#xff08;领导的…

二叉树|450.删除二叉搜索树中的节点

力扣题目链接 class Solution { public:TreeNode* deleteNode(TreeNode* root, int key) {if (root nullptr) return root; // 第一种情况&#xff1a;没找到删除的节点&#xff0c;遍历到空节点直接返回了if (root->val key) {// 第二种情况&#xff1a;左右孩子都为空&…

使用AI 编写一个Mybatis SQL日志解析工具

使用AI 编写一个Mybatis SQL日志解析工具 背景 尝试使用智谱清言 AI 编写一个工具&#xff0c;将Mybatis SQL日志解析为可以执行的SQL语句。 操作 准备初始代码 首先网站上找了一个有BUG的简单的实现 https://blog.csdn.net/x541211190/article/details/107410409 用提示…

【WEEK4】 【DAY5】AJAX第二部分【中文版】

2024.3.22 Friday 接上文【WEEK4】 【DAY4】AJAX第一部分【中文版】 目录 8.4.Ajax异步加载数据8.4.1.新建User.java8.4.2.在pom.xml中添加lombok、jackson支持8.4.3.更改tomcat设置8.4.4.修改AjaxController.java8.4.5.新建test2.jsp8.4.5.1.注意&#xff1a;和WEB-INF平级&…

.NET Core教程:入门与实践实例

.NET Core教程&#xff1a;入门与实践实例 在信息技术飞速发展的今天&#xff0c;掌握一门高效的编程技术成为了每个开发者不可或缺的技能。在众多编程框架中&#xff0c;.NET Core以其跨平台、高性能和易扩展的特性&#xff0c;受到了广大开发者的青睐。本文将通过实例&#…

一文解析:固定电感器结构、作用及其与扼流圈和可变电感器的差异

固定电感器是一种电子元件又称固定线圈&#xff0c;用于在电路中产生固定的电感值。电感是指导致电流变化时产生电动势的能力&#xff0c;通常用亨利&#xff08;Henry&#xff09;作为单位。固定电感器的电感值是预先确定的&#xff0c;通常以特定的数值标识&#xff0c;例如1…