382. 三角形计数 [LintCode]

题目

给定一个整数数组,在该数组中,寻找三个数,分别代表三角形三条边的长度,问,可以寻找到多少组这样的三个数来组成三角形?

样例

例如,给定数组 S = {3,4,6,7},返回 3
其中我们可以找到的三个三角形为:

{3,4,6}
{3,6,7}
{4,6,7}

给定数组 S = {4,4,4,4}, 返回 4
其中我们可以找到的三个三角形为:

{4(1),4(2),4(3)}
{4(1),4(2),4(4)}
{4(1),4(3),4(4)}
{4(2),4(3),4(4)}

思路

(原理:三角形两边之和大于第三边,一种思路是暴力循环三次,这里作不讨论)
1. 先对数组进行排序
2. 从数组下标为2的数开始,取为key值,对小于key值的数进行遍历
3. 遍历:分别从0(begin)和key值下标i-1(end)的位置取值,判断S[begin] + S[end]之和是否大于key值。
4. 若大于,则存在{S[begin],S[end],key}这样的三角形,且下标begin~end之间的数均符合:三角形两边之和大于第三边,即存在(end - begin)个,同时end-1,跳回第三步,继续执行,直到begin>=end
5. 若S[begin] + S[end]之和小于等于key值,则不符合三角形两边之和大于第三边,需要增加S[beging]值,所以begin+1,跳回第三步,直到begin>=end

代码

public class Solution {
    public int triangleCount(int[] S) {
        Arrays.sort(S);
        int count = 0;
        for (int i = 2; i < S.length; i++) {
            int begin = 0;
            int end = i - 1;
            int key = S[i];
            while (begin < end) {
                if (S[begin] + S[end] > key) {
                    count += end - begin;
                    end--;
                } else {
                    begin++;
                }
            }
        }
        return count;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值