
1. 有效三角形个数
1.1 题目链接
题目链接
1.2 题目描述

1.3 题目示例

1.4 算法思路
- 构成三角形的条件:两边之和大于第三边,两边之差小于第三边。验证这两个条件较繁琐,排序后可简化。
- 当三个数 a、b、c 从小到大排序后,只需满足
a + b > c 即可构成有效三角形。
- 在排序后的数组中,固定最大的边
nums[k] 作为三角形的第三边,然后在 [0, k-1] 范围内使用对撞指针寻找满足条件的两边。
- 设置
left = 0 和 right = k-1。当 nums[left] + nums[right] > nums[k] 时,由于数组升序排列,left 到 right-1 的所有位置与当前 right 组成的配对都能满足条件。计数器增加 right - left 个有效组合,然后将 right 左移一位。
- 如果
nums[left] + nums[right] <= nums[k],说明两边之和太小,将 left 右移来增加两边之和。
1.5 核心代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class {
:
{
(nums.(), nums.());
n = nums.();
ret = ;
( i = n - ; i >= ; i--) {
left = , right = i - ;
(left < right) {
(nums[left] + nums[right] > nums[i]) {
ret += right - left;
right--;
} {
left++;
}
}
}
ret;
}
};