382. 三角形计数

描述

给定一个整数数组,在该数组中,寻找三个数,分别代表三角形三条边的长度,问,可以寻找到多少组这样的三个数来组成三角形?

样例

例如,给定数组 S = {3,4,6,7},返回 3
其中我们可以找到的三个三角形为:
{3,4,6}
{3,6,7}
{4,6,7}
给定数组 S = {4,4,4,4}, 返回 4
其中我们可以找到的三个三角形为:
{4(1),4(2),4(3)}
{4(1),4(2),4(4)}
{4(1),4(3),4(4)}
{4(2),4(3),4(4)}

思路

基本的三角形性质,两边之和大于第三边。
先把所有数 排序,然后将第一个数a从index为k开始往后枚举,其他两个数b,c在第一个数的左边(即小于a的区域)开始取,b从0开始,c从k-1开始。统计符合要求(b+c>a)的数目。
b和c从a的左边开始取的原因很简单,如果b和c有一个大于a就没必要寻找b + c大于a的位置了

代码

public class Solution {
    /*
     * @param S: A list of integers
     * @return: An integer
     */
    public int triangleCount(int[] S) {
        int count = 0;
        Arrays.sort(S);
        for (int i = 2; i < S.length; i++) {
            int left = 0;
            int right = i - 1;
            while (left < right) {
                if (S[left] + S[right] > S[i]) {
                    count += right - left;
                    right--;
                } else {
                    left++;
                }
            }
        }
        return count;
    }
}

你可能感兴趣的:(382. 三角形计数)