算法题 有效三角形的个数

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

算法思路

核心思想:排序 + 双指针优化

  1. 排序预处理:将数组升序排列
  2. 固定最长边:枚举每个位置作为三角形的最长边
  3. 双指针查找:在左侧找两个较短边,使其和大于最长边

关键:

  • 三角形成立条件:a + b > c(其中 c 是最长边)
  • 排序后,只需验证 nums[i] + nums[j] > nums[k]
  • 固定 k 为最长边,用双指针在 [0, k-1] 范围内找满足条件的 i,j

优化:

  • 排序后剪枝:一旦 nums[i] + nums[j] > nums[k],则 jk-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 = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值