611. Valid Triangle Number

问题:

求给定数组中,每三个值作为三角形三边,可构成三角形的集合个数。

Example 1:
Input: [2,2,3,4]
Output: 3
Explanation:
Valid combinations are: 
2,3,4 (using the first 2)
2,3,4 (using the second 2)
2,2,3
Note:
The length of the given array won't exceed 1000.
The integers in the given array are in the range of [0, 1000].

  

解法:

先sort整个数组

i 指向最大边,固定不变

j 指向第二大边,k 指向最小边。调整 j 和 k

初始化,i=数组最大值,依次-1,j=i-1,k=0

若nums[k]+nums[j]<=nums[i],两边之和小于等于第三边,不满足三角形。那么需要扩大 k + j 的和,j已经(除了不能动的i)最大,那么调整 k,k++。

反之,满足三角形,那么大于当前 k 和 j 的和的所有(当k=k~j-1的所有值+j)都满足,res+=(j-k)。

接着稍微使得满足条件的 j-- 减小,看看当前 k 是否还能满足。不满足的话增大 k++,同上循环。

代码参考:

 1 class Solution {
 2 public:
 3     int triangleNumber(vector<int>& nums) {
 4         if(nums.size()<3) return 0;
 5         sort(nums.begin(),nums.end());
 6         int i, j, k;
 7         int res=0;
 8         for(i=nums.size()-1; i>1; i--){
 9             j=i-1;
10             k=0;
11             while(k<j){
12                if(nums[k]+nums[j]<=nums[i]){//not good
13                    k++;
14                 }else{
15                    res+=(j-k);
16                    j--;
17                 }
18             }
19         }
20         return res;
21     }
22 };
原文地址:https://www.cnblogs.com/habibah-chang/p/12631135.html