611. Valid Triangle Number

time: O(n^2)

space: O(1)

/*
sort first

small + small > larger

start from 2, want larger be th fix pointer target

how to get count?
t is the target(larger side)
l r t
2 2 3 4
cnt = 1 - 0 = 1

l   r t
2 2 3 4
cnt = 2 - 0 = 2

l r   t
2 2 3 4 
dont count

1+2 = 3

[4,2,3,4]
sort
2 3 4 4


C(3, 4) = 4

same element:

[1, 1, 1, 1]

if consider each 1 are different in actually, this problem dont need ingnore duplicate
               t
1', 1'', 1''', 1
cnt = 1

l          r   t
1', 1'', 1''', 1
cnt = 2

l   r          t
1', 1'', 1''', 1
cnt = 1

1+2+1 = 4
*/
class Solution {
    public int triangleNumber(int[] nums) {
        if (nums == null || nums.length < 3) {
            return 0;    
        }
        
        int cnt = 0;
        Arrays.sort(nums);
        for (int i = 2; i < nums.length; i++) {
            cnt += getCnt(nums, i);
        }
        return cnt;
    }
    private int getCnt(int[] nums, int targetIdx) {
        int cnt = 0;
        
        int left = 0;
        int right = targetIdx - 1;
        
        while (left < right) {
            int sum = nums[left] + nums[right];
            if (sum > nums[targetIdx]) {
                cnt += right - left;
                right--;
            } else {
                left++;
            }
        }
        return cnt;
    }
}

Last updated

Was this helpful?