Valid Triangle Number
Sort, then for each largest side use two pointers to count valid (a, b) pairs.
3 min read
two-pointers sorting
Problem#
Count triples (i, j, k) from nums that can form a triangle (the sum of any two sides exceeds the third).
Examples#
nums = [2,2,3,4]→3nums = [4,2,3,4]→4
Constraints#
1 <= nums.length <= 1000,0 <= nums[i] <= 1000.
Approach#
Sort. For each k (largest side index), keep two pointers l = 0, r = k - 1. If nums[l] + nums[r] > nums[k], then every l..r-1 paired with r works (so add r - l); decrement r. Otherwise increment l.
Solution#
class Solution {public: int triangleNumber(vector<int>& nums) { sort(nums.begin(), nums.end()); int n = nums.size(), ans = 0; for (int k = n - 1; k >= 2; --k) { int l = 0, r = k - 1; while (l < r) { if (nums[l] + nums[r] > nums[k]) { ans += r - l; --r; } else { ++l; } } } return ans; }};import "sort"
func triangleNumber(nums []int) int { sort.Ints(nums) n, ans := len(nums), 0 for k := n - 1; k >= 2; k-- { l, r := 0, k-1 for l < r { if nums[l]+nums[r] > nums[k] { ans += r - l r-- } else { l++ } } } return ans}from typing import List
class Solution: def triangleNumber(self, nums: List[int]) -> int: nums.sort() n, ans = len(nums), 0 for k in range(n - 1, 1, -1): l, r = 0, k - 1 while l < r: if nums[l] + nums[r] > nums[k]: ans += r - l r -= 1 else: l += 1 return ansfunction triangleNumber(nums) { nums.sort((a, b) => a - b); const n = nums.length; let ans = 0; for (let k = n - 1; k >= 2; k--) { let l = 0, r = k - 1; while (l < r) { if (nums[l] + nums[r] > nums[k]) { ans += r - l; r--; } else { l++; } } } return ans;}class Solution { public int triangleNumber(int[] nums) { Arrays.sort(nums); int n = nums.length, ans = 0; for (int k = n - 1; k >= 2; k--) { int l = 0, r = k - 1; while (l < r) { if (nums[l] + nums[r] > nums[k]) { ans += r - l; r--; } else { l++; } } } return ans; }}function triangleNumber(nums: number[]): number { nums.sort((a, b) => a - b); const n = nums.length; let ans = 0; for (let k = n - 1; k >= 2; k--) { let l = 0, r = k - 1; while (l < r) { if (nums[l] + nums[r] > nums[k]) { ans += r - l; r--; } else { l++; } } } return ans;}Editorial#
Once sorted, the triangle inequality reduces to the single condition that the two smaller sides exceed the largest. Two pointers count valid (l, r) pairs for each k in O(n), giving O(n^2) overall — much better than O(n^3) brute force.
Complexity#
- Time: O(n^2).
- Space: O(1).
Concept revision#
Related#