public int triangleNumber(int[] nums) {
        int n = nums.length;
        Arrays.sort(nums);
        int ret = 0;
        for (int i = 0; i < n; i++) {
            // nums[i] 为第一条边 a
            for (int j = i + 1; j < n; j++) {
                // nums[j] 为第二条边 b

                int left = j + 1, right = n - 1, pos = j;
                while (left <= right) {
                    int mid = left + (right - left) / 2;
                    if (nums[mid] < nums[i] + nums[j]) {
                        pos = mid;
                        left = mid + 1;
                    } else {
                        right = mid - 1;
                    }
                }
                ret += pos - j;
            }
        }
        return ret;
    }