import java.util.*;
/**
* NC254 合法的三角形个数
* @author d3y1
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
public int validTriangleNumber (int[] nums) {
return solution(nums);
}
/**
* 二分
* @param nums
* @return
*/
private int solution(int[] nums){
Arrays.sort(nums);
int n = nums.length;
int result = 0;
int target;
int left,right,mid;
// 三角形两边之和大于第三边
for(int i=0; i<n; i++){
for(int j=i+1; j<n; j++){
// 两条短边之和
target = nums[i]+nums[j];
// 二分
left = j+1;
right = n-1;
while(left <= right){
mid = (left+right)/2;
if(nums[mid] < target){
left = mid+1;
}else{
right = mid-1;
}
}
// 可选第三边个数
result += (left-j-1);
}
}
return result;
}
}