首页 > 试题广场 >

合法的三角形个数

[编程题]合法的三角形个数
  • 热度指数:1032 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给一个长度为N的非负整数数组nums,请你计算一下,有多少个三元组代表的边长可以组成三角形
数据范围:


示例1

输入

[2,3,4,4]

输出

4

说明

合法的有4个:
2 3 4(第一个4)
2 3 4(第二个4)
2 4 4
3 4 4

class Solution:
    def validTriangleNumber(self , nums: List[int]) -> int:
        nums.sort()
        res = 0
        for i in range(len(nums)):
            for j in range(i+1, len(nums)):
                left, right = j+1, len(nums)-1
                while left <= right:
                    mid = left + (right - left) // 2
                    if nums[mid] < nums[i] + nums[j]:
                        left = mid + 1
                    else:
                        right = mid - 1
                res += left - (j+1)
        return res

发表于 2022-08-13 15:38:51 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型
     */
    public int validTriangleNumber (int[] nums) {
        int n = nums.length;
        Arrays.sort(nums);
        int ans = 0;
        for (int i = 0; i + 2 < n; i++) {
            for (int j = i + 1; j + 1 < n; j++) {
                int tt = nums[i] + nums[j];
                // 一种通用的二分法,取left和right都在边界外一个
                int left = j, right = n;
                while (left + 1 != right) {
                    int mid = left + (right - left)/2;
                    if (nums[mid] < tt) {
                        left = mid;
                    } else {
                        right = mid;
                    }
                }
                ans += (left - j);
            }
        }
        return ans;
    }
}

发表于 2022-06-08 17:06:21 回复(0)
import bisect
class Solution:
    def validTriangleNumber(self , nums: List[int]) -> int:
        # write code here
        if len(nums) < 3: return 0        
        count = 0
        nums.sort()
        for i in range(len(nums)-1):
            for j in range(i+1, len(nums)):
                count += bisect.bisect_left(nums[j+1:], nums[i]+nums[j])        
        return count

发表于 2022-04-27 09:40:01 回复(0)

问题信息

上传者:牛客301499号
难度:
3条回答 1994浏览

热门推荐

通过挑战的用户

查看代码