题目描述

给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。

示例 1:

输入: [2,2,3,4]
输出: 3
解释:
有效的组合是: 
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3

注意:

  • 数组长度不超过1000。

  • 数组里整数的范围为 [0, 1000]。

题目解析

题目要求选出三条边,使得这三条边能够构成三角形,咋眼看上去这道题貌似和 TwoSum 没啥关系。

但我们回顾一下中学时期学的东西,三边构成三角形的条件是 任意两边之和大于第三边,那是不是说我们需要把三条边都组合配对考虑一下?其实不用,我们可以得出下面的结论

a < b < c && a + b > c => 三角形

如果已知三条边的大小顺序,那么其实我们只需要比较一次即可。

你再看看这是不是我们熟悉的 TwoSum 变种问题 - 如果题目要求找到比 target 小/大 的配对该怎么处理?

这个时候我们从右往左选定 c ,然后使用 TwoSum 来找出 a 、b 即可,由于题目只要求输出个数,那么直接相加即可。

动画描述


代码实现

public int triangleCount(int[] S) {
    if (S == null || S.length == 0) {
        return 0;
    }

    Arrays.sort(S);

    int result = 0;

    for (int i = S.length - 1; i >= 2; --i) {
        int l = 0, r = i - 1;
        while (l < r) {
            if (S[i] < S[l] + S[r]) {  // S[i] < S[l] + S[r] && S[i] > S[r] > S[l]
                result += r - l;  //  直接加上可能的个数
                r--;
            } else {
                l++;
            }
        }
    }

    return result;
}


图解 LeetCode 系列目前都同步更新在 GitHub 上面,小伙伴们在电脑端进行访问阅读:https://github.com/MisterBooo/LeetCodeAnimation



©著作权归作者所有:来自51CTO博客作者mb5fe18fab305a5的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 一道简单的数组题目:删除排序数组中的重复项
  2. 解答、收录了 8 道 MyBatis 的题目
  3. Python能不能方便的画三角形?
  4. python输出斐波那契数列三角形
  5. python题目——认识*与**,判断函数输出
  6. 嵌入式或LINUX相关研发面试题目
  7. 面试程序员SQL题目?哪位大哥大姐帮我看看 这怎么做? 谢谢
  8. 软件大赛题目----(第一个)Java
  9. java三角形的画法

随机推荐

  1. 【Android】获得已安装应用
  2. android网站汇总
  3. android service 精辟解说(摘)
  4. Android 横屏时禁止输入法全屏
  5. 利用Android的Log 演示一个activity的生
  6. android 读写文件数据
  7. 关于屏幕解锁的实例
  8. Android 隐藏系统状态栏和标题栏
  9. Android(安卓)AsyncTask
  10. IDEA Android studio toString() 生成Jso