­

图解两数之和的变形题之「有效三角形的个数」

  • 2019 年 10 月 5 日
  • 筆記

作者 | P.yh

来源 | 五分钟学算法

今天分享的题目来源于 LeetCode 上第 611 号问题:有效三角形的个数。

题目描述

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

示例 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