给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。 **示例 1:** ```js 输入: [2,2,3,4] 输出: 3 解释: 有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3 ``` **注意:** - 数组长度不超过1000。 - 数组里整数的范围为 [0, 1000]。 附赠leetcode地址:[leetcode](https://leetcode-cn.com/problems/valid-triangle-number/solution/teng-xun-leetcode611you-xiao-san-jiao-xing-de-ge-s/)
Activity
sisterAn commentedon Aug 10, 2020
本题可结合:
一起练习
解法:排序+双指针
我们知道三角形的任意两边之和大于第三边,任意两边之差小于第三边,如果这三条边长从小到大为
a、b、c,当且仅当a + b > c这三条边能组成三角形解题思路: 先数组排序,排序完后,固定最长的边,利用双指针法判断其余边
以
nums[nums.length - 1]作为最长的边nums[k](k = nums.length - 1)以
nums[i]作为最短边,以nums[nums.length - 2]作为第二个数nums[j](j = nums.length - 2) ,判断
nums[i] + nums[j]是否大于nums[k],nums[i] + nums[j] > nums[k],则:则可构成三角形的三元组个数加
j-i,并且j往前移动一位(j--), 继续进入下一轮判断nums[i] + nums[j] <= nums[k],则l往后移动一位(nums是增序排列),继续判断代码实现:
复杂度分析:
注意:
关于
Array.prototype.sort(),ES 规范并没有指定具体的算法,在 V8 引擎中, 7.0 版本之前,数组长度小于10时,Array.prototype.sort()使用的是插入排序,否则用快速排序。在 V8 引擎 7.0 版本之后就舍弃了快速排序,因为它不是稳定的排序算法,在最坏情况下,时间复杂度会降级到 O(n2)。
而是采用了一种混合排序的算法:TimSort 。
这种功能算法最初用于Python语言中,严格地说它不属于以上10种排序算法中的任何一种,属于一种混合排序算法:
在数据量小的子数组中使用插入排序,然后再使用归并排序将有序的子数组进行合并排序,时间复杂度为
O(nlogn)。leetcode
chenzesam commentedon Aug 11, 2020
这个题目和三数之和雷同吧,只是将 a + b = c 的判定公式改成 a² + b² = c²。
Glittergalaxy commentedon Aug 11, 2020
判定公式是 任意两边之和大于第三边
xuanweiH commentedon Nov 1, 2020
count+=1 吧 怎么会是count += j-1
wcora commentedon Nov 9, 2020
就是
+= j - i,因为num[j] + num[i]足够大了,所以从num[i]到num[j-1]的数字 加上num[j]都可以符合条件因为只要
i够大右边j的bound是每轮都会变的,所以不会数重复xuanweiH commentedon Nov 10, 2020
感谢, 确实如此 之前看错了