给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。
示例:
输入: [2,2,3,4]
输出: 3
解释:
有效的组合是:
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3
思路1:
判断能否构成三角形的基础办法是任意两边之和大于第三条边,那么暴力的去解决就得选取两条边,再选取第三条边进行比较,时间复杂度O(n^3),复杂度有点高。
思路2:
现在想想优化方案,一个简单的思路是先对原数组排序,时间复杂度O(nlogn),并不影响思路一的时间复杂度,好,现在我们有了一个排好序的数组,那现在有什么优势呢,比如说我们依旧先取两条边,现在从后往前遍历,找到满足先前找出的两条边之和大于第三条边时暂停,这时该边和该边之前的全不满足,该边之后全不满足。然而这样数据差的时候依旧不能逃过O(n^3)的悲惨命运
思路3:
O(n3)复杂度太高了,那能不能O(n2)呢。之前我们的思路都是先选取两条边,这样就已经O(n^2)了,貌似已经不行了。。。那能不能先取一条边呢?仔细想想,好像是可以的。这一条边可以取那个所谓的第三条边,然后找前两条边,此时我们假设第三条(最长边)的数组下标为k,这个时候前两条边的下标范围为0到n-1,现在起开始维护两个指针,第一个指针p指向0,第二个指针q指向n-1,这两个指针位置对应我们当前选取的两条边,现在将这两条边相加,如果大于第三条边,统计边数+(q-p),q–(即取当前q值时的情况取完了),否则p++(即头指针向后移动)
具体代码如下
package leetcode;
import java.util.Arrays;
public class Solution{
public int triangleNumber(int[] nums) {
int count = 0;
Arrays.sort(nums);
int len = nums.length;
if(len<3){
return 0;
}
else{
for(int i=2;i<len;i++){
int l=0;
int r=i-1;
while(l<r){
if(nums[l]+nums[r]>nums[i]){
count+=(r-l);
r--;
}else{
l++;
}
}
}
}
return count;
}
}
给定一个非负整数数组,该问题旨在计算能构成三角形边长的三元组数量。通过排序数组并采用双指针策略,可以将时间复杂度降低到O(n^2),从而提高效率。示例输入为[2,2,3,4],输出为3,有效组合包括:2,3,4(两次)和2,2,3。"
113672922,10538515,Python创建非均匀泊松方程三对角矩阵问题解析,"['Python编程', '数值计算', '矩阵运算', '科学计算', 'scipy库']


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



