【优选算法】——Leetcode——611. 有效三角形的个数

news/2024/9/22 11:11:10/

目录

​编辑

1.题目 

2 .补充知识

3.解法⼀(暴⼒求解)(可能会超时):

算法思路:

 算法代码:

 4.解法⼆(排序+双指针):

算法思路:

 以输入: nums = [4,2,3,4]为例​编辑

​ 5.代码实现

1.C语言

2.C++


1.题目 





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

提示:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 1000

2 .补充知识

三个数构成三角形的条件

假设三条边长度为:a, b, c

则构成三角形的条件要同时满足以下条件:

a+b>c

a+c>b

b+c>a

若已知a<=b<=c

则只需满足a+b>c就可以

3.解法⼀(暴⼒求解)(可能会超时):

算法思路:

三层fo循环枚举出所有的三元组,并且判断是否能构成三⻆形。


虽然说是暴⼒求解,但是还是想优化⼀下:
判断三⻆形的优化:


▪ 如果能构成三⻆形,需要满⾜任意两边之和要⼤于第三边。但是实际上只需让较⼩的两条边之和⼤于第三边即可。


▪ 因此我们可以先将原数组排序,然后从⼩到⼤枚举三元组,⼀⽅⾯省去枚举的数量,另⼀⽅⾯⽅便判断是否能构成三⻆形。

 算法代码:


class Solution {
public:int triangleNumber(vector<int>& nums) {// 1. 排序sort(nums.begin(), nums.end());int n = nums.size(), ret = 0;// 2. 从⼩到⼤枚举所有的三元组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;}
};

 4.解法⼆(排序+双指针):


算法思路:


先将数组排序。


根据「解法⼀」中的优化思想,我们可以固定⼀个「最⻓边」,然后在⽐这条边⼩的有序数组中找出⼀个⼆元组,使这个⼆元组之和⼤于这个最⻓边。由于数组是有序的,我们可以利⽤「对撞指针」来优化。


设最⻓边枚举到 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 位置的元素是不可能与 [left + 1, right] 位置上的元素构成满⾜条件
的⼆元组
▪ left 位置的元素可以舍去, left++ 进⼊下轮循环

 以输入: nums = [4,2,3,4]为例

right-- 

 C移位

 5.代码实现

1.C语言

void quick_sort(int arr[], int left, int right)
{if (left < right){int i = left, j = right, pivot = arr[left];while (i < j){while (i < j && arr[j] >= pivot) j--;if (i < j) arr[i++] = arr[j];while (i < j && arr[i] < pivot) i++;if (i < j) arr[j--] = arr[i];}arr[i] = pivot;quick_sort(arr, left, i - 1);quick_sort(arr, i + 1, right);}
}int triangleNumber(int* nums, int numsSize){// 1. 优化quick_sort(nums,0,numsSize-1); // 排序// 2. 利⽤双指针解决问题int ret = 0;for (int i = numsSize - 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;
}

2.C++

class Solution {
public:int triangleNumber(vector<int>& nums) {// 1. 优化sort(nums.begin(), nums.end());// 2. 利⽤双指针解决问题int ret = 0, n = nums.size();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;}
};

 


http://www.ppmy.cn/news/1457984.html

相关文章

一分钟教你学浪app视频怎么缓存

你是否在学浪app上苦苦寻找如何缓存视频的方法&#xff1f;你是否想快速、轻松地观看自己喜欢的视频内容&#xff1f;那么&#xff0c;让我们一起探索一分钟教你如何缓存学浪app视频的技巧吧&#xff01; 学浪下载工具我已经打包好了&#xff0c;有需要的自己下载一下 学浪下…

若依分离版-前端使用echarts组件

1 npm list:显示已安装的模块 该命令用于列出当前项目的所有依赖关系&#xff0c;包括直接依赖和间接依赖。执行 npm list 时&#xff0c;npm 将从当前目录开始&#xff0c;递归地列出所有已安装的模块及其版本信息 npm list 2 npm outdated:用于检查当前项目中的npm包是否有…

给网站网页PHP页面设置密码访问代码

将MkEncrypt.php文件上传至你网站根目录下或者同级目录下。 MkEncrypt.php里面添加代码&#xff0c;再将调用代码添加到你需要加密的页进行调用 MkEncrypt(‘123456’);括号里面123456修改成你需要设置的密码。 密码正确才能进去页面&#xff0c;进入后会存下cookies值&…

python连接mysql

这里写自定义目录标题 安装基本使用示例 安装 pip install pymysql基本使用 #数据的增删改 import pymysql #1.创建一个链接对象:决定了要去访问链接哪一个数据库服务器下的哪一个数据仓库 connpymysql.Connection(user"root", # 数据库用户名password"12345…

ue引擎游戏开发笔记(34)——建立射击映射,并添加特效

1.需求分析&#xff1a; 准备处理射击系统&#xff0c;首先角色需要能射击&#xff0c;有反馈&#xff0c;先建立角色与控制器之间的映射&#xff0c;并添加简单特效&#xff0c;证明映射已经建立。 2.操作实现&#xff1a; 1.首先常规建立映射流程&#xff0c;具体可参考笔记…

Ubuntu添加网络映射路径

参考资料 linux挂在阿里云盘&#xff08;webdav协议&#xff09;给服务器扩容、备份数据等_davfs2-CSDN博客 Linux将WebDAV为本地磁盘 - 夏日冰菓 (lincloud.pro) systemd系统开机运行rc.local_rc-local.service: failed to execute command: exec -CSDN博客 系统版本&#xff…

20个入门级Python项目

很多刚刚入门python的同学除了书上、老师讲解的1、2个demo示例之外&#xff0c;基本上很难找到适合练手的入门级Python项目。 作者不辞辛苦&#xff0c;花了很长时间整理了20个适合练手的实例项目 下面这20个练手项目全部去是免费的&#xff0c;大家可以任意下载&#xff0c;…

git对远程和本地分支进行重命名

要同时对Git的远程和本地分支进行重命名&#xff0c;你需要分几个步骤操作&#xff1a; 重命名本地分支 切换到其他分支&#xff1a;在重命名当前分支之前&#xff0c;确保你不在你想要重命名的那个分支上。你可以通过以下命令切换到另一个分支&#xff08;比如切换到master分…