网站改版 合同,做签证宾馆订单用啥网站,自学黑客编程入门,wordpress the id文章目录 一、题目二、算法讲解三、题目链接四、补充 一、题目 给定一个包含非负整数的数组 nums #xff0c;返回其中可以组成三角形三条边的三元组个数。 示例1#xff1a; 输入: nums [2,2,3,4] 输出: 3 **解释:**有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 … 文章目录 一、题目二、算法讲解三、题目链接四、补充 一、题目 给定一个包含非负整数的数组 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 暴力枚举三层循环得到一个三角形的三条边然后判断是否为三角形但是时间复杂度为O(n3)可能会超时。
思路2 可以通过双指针来模拟三层循环的过程通过一些条件来规避三层循环。
首先对数据进行升序排序将最后也就是最大的数设置为第三条边。两个指针left和right分别指向数据开头和最大数的前一个位置进行判断 如果left和right的和大于最大的数那么固定rightleft两数之和都大于最大的数因为该组数据是升序这时候就相当于把right这个位置的数的每种可能都遍历了一遍只要right-left计算一下三角形个数加到一起就行了之后right– 如果left和right的和小于最大的数那么固定leftright–每种情况都是小于最大的数的这时候就相当于把left这个位置的数的每种可能都遍历了一遍由于这种情况是不满足三角形的只需要left就行了。最大的数位置-1回到步骤3再次进行判断直到最大数的位置到2因为从0开始0、1位置肯定不可能作为三角形最大的边。
代码
class Solution {
public:int triangleNumber(vectorint nums) {sort(nums.begin(),nums.end());int ret 0;int n nums.size();for(int i n-1; i2; --i){int left0,righti-1;while(leftright){if((nums[left]nums[right])nums[i]){ret(right-left);right--;}else{left;}}}return ret;}
};三、题目链接
611. 有效三角形的个数
四、补充
类似的题目还有 11. 盛最多水的容器