有效三角形的个数
难度:
标签:
题目描述
代码结果
运行时间: 437 ms, 内存: 16.0 MB
/*
* 思路:
* 1. 使用 Java Stream 的方式进行数据处理。
* 2. 首先将数组进行排序。
* 3. 然后利用三重循环的方式,通过过滤器(filter)找到满足条件的组合。
*/
import java.util.Arrays;
public class TriangleNumberStream {
public long triangleNumber(int[] nums) {
Arrays.sort(nums); // Step 1: Sort the array
return IntStream.range(0, nums.length - 2) // Iterate over possible k values
.flatMap(k -> IntStream.range(0, k) // Iterate over possible j values
.flatMap(i -> IntStream.range(i + 1, k) // Iterate over possible i values
.filter(j -> nums[i] + nums[j] > nums[k]) // Filter valid triples
.count() // Count valid triples for each (i, j, k)
)).sum(); // Sum up all counts
}
}
解释
方法:
这个题解使用了二分查找的思路。首先将数组按升序排序,然后固定最长边 c,用双指针 a 和 b 分别指向最短边和中间边。在 a 和 b 范围内查找符合条件的三角形组合。如果 nums[a] + nums[b] > c,说明存在满足条件的三角形,数量为 b - a,然后将 b 左移缩小范围;否则将 a 右移扩大范围。最后遍历所有可能的最长边 c,将满足条件的三角形数量累加到结果中。
时间复杂度:
O(n^2)
空间复杂度:
O(1)
代码细节讲解
🦆
为什么在实现中选择首先对数组进行排序?排序对解题策略有什么影响?
▷🦆
在选择固定最长边c并使用双指针a和b时,这种方法是否确保了检查所有可能的三元组组合?
▷🦆
为什么当`nums[a] + nums[b] > c`时,可以直接累加`b - a`作为有效的组合数目?这样做的数学逻辑是什么?
▷🦆
如果在某次迭代中`nums[a] + nums[b] <= c`,为什么选择移动指针a(最短边)而不是指针b(中间边)?
▷