lintcode-382-三角形计数

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

标签

两根指针 LintCode 版权所有

思路

三角形两边之和大于第三边,先将数组排序,然后定位最长边与最短边,然后寻找第三条边的数量,第三条边满足:
最长边 >= 第三条边 > 最长边 - 最短边
可以利用二分查找寻找最短的第三条边的下标,然后和最长边下标之差就是第三条边的数量
最后继续定位定位最长边与最短边

code

class Solution {
public:
    /*
     * @param : A list of integers
     * @return: An integer
     */
    int triangleCount(vector<int> S) {
        // write your code here
        int size = S.size();
        if (size <= 0) {
            return 0;
        }

        int result = 0;
        sort(S.begin(), S.end());
        for (int i = 0; i < size - 1; i++) {
            for (int j = i + 1; j < size; j++) {
                int third = S[j] - S[i];
                int low = i + 1, high = j;
                while (low < high) {
                    int mid = low + (high - low) / 2;
                    if (S[mid] > third) {
                        high = mid;
                    }
                    else {
                        low = mid + 1;
                    }
                }
                result += (j - low);
            }
        }
        return result;
    }
};
原文地址:https://www.cnblogs.com/libaoquan/p/7324614.html