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