1、有效三角形的个数
给定一个包含非负整数的数组 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
解题思路:
- 暴力解法:枚举所有的三条边,判断它们是否可以组成三角形,记录有效三角形的个数。不过 n^3 的时间复杂度会超出时间限制!
class Solution {
public:
int triangleNumber(vector<int>& nums) {
int len=nums.size(),count=0;
for(int a=0;a<len-2;a++) {
for(int b=a+1;b<len-1;b++) {
for(int c=b+1;c<len;c++) {
if(nums[a]+nums[b]>nums[c] &&nums[a]+nums[c]>nums[b] &&nums[b]+nums[c]>nums[a]) count++;
}
}
}
return count;
}
};
-
更优解法:先将数组排序,因为判断三个数是否可以构成三角形只需要比较较小两边之和是否大于第三边即可。
-
排序后,
nums[len-1]的位置就是最大值,我们先用right_idx固定一端,right固定在right_idx左侧,left固定在起点。 -
判断
nums[left]+nums[right]是否大于nums[right_idx]。- a. 如果小于,
left++ - b. 如果大于,
count+=(right-left)。固定right_idx和right两边后,left是right之后最小的一边。如果最小的一边加上right都大于right_idx,那其后的边一定可以构成三角形。所以我们就没有必要进行无意义的枚举。
- a. 如果小于,


