[Algo][July][Homework][lintcode](382)三角形计数

时间:2022-08-04 00:36:56

题目:

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

例如,给定数组 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)}

解题思路:

O(n3)的算法就不赘述了,暴力搜索。

优化算法:

首先先对数组排序。

 1 class Solution {
 2 public:
 3     /*
 4      * @param S: A list of integers
 5      * @return: An integer
 6      */
 7     int triangleCount(vector<int> &S) {
 8         // write your code here
 9         int ret = 0;
10         int iSize = S.size();
11         if (iSize<=2){
12             return 0;
13         }
14         sort(S.begin(),S.end()); //排序,从小到大排
15         for (int i = 2; i<iSize; ++i){
16             int pleft = 0;    //left永远从最小的开始
17             int pright = i-1; //right从key次大的开始
18             int key = S[i];
19             while(pleft<pright){
20                 if(S[pleft]+S[pright]>key){ //如果相加大于key,那么就再right就再尝试小一点儿的数
21                     ret += pright - pleft; //如果加下大于key,那么表示比left大的数加right也大于key
22                     pright--;
23                 }
24                 else{  //如果相加小于key,就再尝试left侧大一点儿的数
25                     pleft++;
26                 }
27             }
28         }
29         return ret;
30     }
31 };