leetCode 有效三角形的个数

给定一个非负整数数组,该问题旨在计算能构成三角形边长的三元组数量。通过排序数组并采用双指针策略,可以将时间复杂度降低到O(n^2),从而提高效率。示例输入为[2,2,3,4],输出为3,有效组合包括:2,3,4(两次)和2,2,3。" 113672922,10538515,Python创建非均匀泊松方程三对角矩阵问题解析,"['Python编程', '数值计算', '矩阵运算', '科学计算', 'scipy库']

给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。
示例:
输入: [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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值