package com.yefan.leetcode; import java.util.Arrays; /** * @Auther: zq * @Date: 2021/8/4 09:40 * @Description: 有效三角形的个数 public class NumberOfValidTriangles { /* 二分查找 首先对数组排序。 固定最短的两条边,二分查找最后一个小于两边之和的位置。可以求得固定两条边长之和满足条件的结果。枚举结束后,总和就是答案。 时间复杂度为 O(n^2logn) */ publicinttriangleNumber(int[] nums){ Arrays.sort(nums); int n = nums.length; int res = 0; for (int i = 0; i < n - 2; ++i) { for (int j = i + 1; j < n - 1; ++j) { int s = nums[i] + nums[j]; int l = j + 1, r = n - 1; while (l < r) { int mid = l + r + 1 >>> 1; if (nums[mid] < s) l = mid; else r = mid - 1; } if (nums[r] < s) { res += r - j; } } } return res; } }