611. 有效三角形的个数
题目:
思路:
【1】这种其实常规的会想到树的方式处理,因为每三个数值都是可以作为一个组合,树遍历的方式更加通俗,但是其实可以用双指针的方式进行优化。
代码展示:
//时间230 ms 击败 35.95% //内存42 MB 击败 49.31% class Solution { public int triangleNumber(int[] nums) { int n = nums.length; Arrays.sort(nums); int ans = 0; for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { int left = j + 1, right = n - 1, k = j; while (left <= right) { int mid = (left + right) / 2; if (nums[mid] < nums[i] + nums[j]) { k = mid; left = mid + 1; } else { right = mid - 1; } } ans += k - j; } } return ans; } } //时间28 ms 击败 91.3% //内存41.9 MB 击败 74.92% class Solution { public int triangleNumber(int[] nums) { Arrays.sort(nums); int ans = 0; int n = nums.length; for (int i = n - 1; i >= 2; --i) { int left = 0, right = i - 1; while(left < right) { if (nums[left] + nums[right] > nums[i]) { //为什么是right-left?比如 1 2 3 4 5 6 //当i=5,left=1,right=4时,有right-left=3种可能 //即2 5 6 、3 5 6 、4 5 6,不是2 5 、5 2 、3 4、4 3这样算 ans += right - left; right--; }else { left++; } } } return ans; } }