leetcode 611. 有效三角形的个数
给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。
示例 1:
输入: [2,2,3,4]
输出: 3
解释:
有效的组合是:
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3
注意:
数组长度不超过1000。
数组里整数的范围为 [0, 1000]。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-triangle-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
排序 + 二分查找
1:首先排序
2:之后双重循环,遍历数组,
从数组中取出 i 和 j。
对i 和 j对应的元素求和 t,第三边的长度可定是 nums[j] < 第三边 < t。
因为是排好序的数组了,所以用二分法查找小于 t的最大值n(查找范围为[j, length])。
n - j 的值为 以 i 和 j为短边的可以组成三角形的个数。
public int triangleNumber(int[] nums) { Arrays.sort(nums); int length = nums.length - 1; int sum = 0; for (int i = 0; i < length; i++) { for (int j = i + 1; j < length; j++) { int t = nums[i] + nums[j]; int n = find(nums, j, length, t); sum += (n - j); } } return sum; } private int find(int[] arr, int st, int end, int t) { while (st < end) { int m = st + ((end - st + 1) >> 1); if (arr[m] < t) { st = m; } else { end = m - 1; } } return st; }