611. 有效三角形的个数
问题描述
给定一个包含非负整数的数组 nums,返回可以形成有效三角形的三元组数量。
有效三角形定义:三个正数能构成三角形,当且仅当任意两边之和大于第三边。
示例:
输入: nums = [2,2,3,4]
输出: 3
解释: 有效组合为:
- (2,3,4): 2+3>4, 2+4>3, 3+4>2
- (2,3,4): 另一个2
- (2,2,3): 2+2>3, 2+3>2, 2+3>2
算法思路
核心思想:排序 + 双指针优化
- 排序预处理:将数组升序排列
- 固定最长边:枚举每个位置作为三角形的最长边
- 双指针查找:在左侧找两个较短边,使其和大于最长边
关键:
- 三角形成立条件:
a + b > c(其中c是最长边) - 排序后,只需验证
nums[i] + nums[j] > nums[k] - 固定
k为最长边,用双指针在[0, k-1]范围内找满足条件的i,j
优化:
- 排序后剪枝:一旦
nums[i] + nums[j] > nums[k],则j到k-1的所有位置都满足 - 双指针移动:根据和的大小决定指针移动方向
代码实现
import java.util.Arrays;
class Solution {
/**
* 计算能构成有效三角形的三元组数量
*
* @param nums 非负整数数组
* @return 有效三角形的数量
*/
public int triangleNumber(int[] nums) {
// 边界情况:少于3个元素无法构成三角形
if (nums == null || nums.length < 3) {
return 0;
}
// 第一步:排序,便于后续双指针操作
Arrays.sort(nums);
int count = 0; // 记录有效三角形数量
// 第二步:枚举最长边的位置k(从2开始,因为需要至少3个元素)
for (int k = 2; k < nums.length; k++) {
int left =

最低0.47元/天 解锁文章
636

被折叠的 条评论
为什么被折叠?



