给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。
示例 1:
输入: [2,2,3,4]
输出: 3
解释:
有效的组合是:
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3
解题思路:
三条边长从小到大为 a、b、c,当且仅当 a + b > c 这三条边能组成三角形。
首先对数组排序。此时,数组中的相对大的值就在数组后面,我们即可固定最长的一条边,二分查找其余的两条边。
代码:
class Solution {
public int triangleNumber(int[] nums) {
// 1. 首先对数组进行排序
Arrays.sort(nums);
// 2. 保存最后的结果
int ans = 0;
// 3. 从后向前进行遍历,这是因为最后的元素是目前的最大值
// i >= 2,这是为了保证有3个数组成三角形
// 需要寻找较小的两个值的和大于目前的最大值
for(int i = nums.length - 1; i >= 2; i--) {
// 4. 通过二分寻找较小的两个值
int left = 0;
int right = i - 1;
while(left < right) {
if(nums[left] + nums[right] > nums[i]) {
// 从left到right - 1都可组成三角形
ans += right - left;
right--;
}else {
left++;
}
}
}
return ans;
}
}
时间复杂度为:O(N^2)
空间复杂度为:O(logN)
题目链接:(https://leetcode-cn.com/problems/valid-triangle-number/)
这篇博客介绍了如何解决LeetCode的第611题,即有效三角形的个数问题。通过排序数组并使用二分查找策略,可以有效地找出能构成三角形边长的三元组,时间复杂度为O(N^2),空间复杂度为O(logN)。
2397

被折叠的 条评论
为什么被折叠?



