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;
    }

posted @ 2021-08-04 09:47  旺仔古李  阅读(54)  评论(0编辑  收藏  举报