LintCode刷题--三角形技术

来源:互联网 发布:传奇数据库 编辑:程序博客网 时间:2024/06/01 08:53

题目如下:

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

样例

例如,给定数组 S = {3,4,6,7},返回 3

其中我们可以找到的三个三角形为:

{3,4,6}{3,6,7}{4,6,7}

读了一遍题目的后的思路:

先确定两条边,根据第三条边不大于两边只和 且 不小于两边只差的原理 搜索第三条边

最短边 i=0;i<S.count-1;i++

最长边 j=i+2;j<S.count;j++

第三条边考虑到时间问题 使用二分法查找

int triangleCount(vector<int> &S) {        // write your code here        int sum = 0;        int n = S.size();        sort(S.begin(), S.end());        for(int i=0;i<n;i++)        {            for(int j=i+2;j<n;j++)            {                int st=i+1;                int end=j;               //二分法查找中间边  0 i+2 i i+3             while(st<end)            {                int mid=(st+end)/2;                   if(S[mid]>(S[j]-S[i]))                end=mid;                else                {                    st++;                }                            }            sum+=(j-st);            }                    }        return sum;    }


原创粉丝点击