每日算法:有效三角形的个数

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

[[429712]]

本文转载自微信公众号「三分钟学前端」,作者sisterAn。转载本文请联系三分钟学前端公众号。

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

示例 1:

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

注意:

  • 数组长度不超过1000。
  • 数组里整数的范围为 [0, 1000]。

解法:排序+双指针

我们知道三角形的任意两边之和大于第三边,任意两边之差小于第三边,如果这三条边长从小到大为 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] ,则:
nums[i+1] + nums[j] > nums[k] 
nums[i+2] + nums[j] > nums[k] 
... 
nums[j-1] + nums[j] > nums[k] 
  • 1.
  • 2.
  • 3.
  • 4.

则可构成三角形的三元组个数加 j-i ,并且 j 往前移动一位( j-- ), 继续进入下一轮判断

  • nums[i] + nums[j] <= nums[k],则 l 往后移动一位(nums 是增序排列),继续判断

代码实现:

let triangleNumber = function(nums) { 
    if(!nums || nums.length < 3) return 0 
    let count = 0 
    // 排序 
    nums.sort((a, b) => a - b)  
    for(let k = nums.length - 1; k > 1; k--){ 
        let i = 0, j = k - 1 
        while(i < j){  
            if(nums[i] + nums[j] > nums[k]){ 
                count += j - i 
                j-- 
            } else { 
                i++ 
            } 
        } 
    }        
    return count 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

复杂度分析:

  • 时间复杂度:O(n^2^)
  • 空间复杂度:O(n)

注意:

关于 Array.prototype.sort() ,ES 规范并没有指定具体的算法,在 V8 引擎中, 7.0 版本之前,数组长度小于10时, Array.prototype.sort() 使用的是插入排序,否则用快速排序。

在 V8 引擎 7.0 版本之后就舍弃了快速排序,因为它不是稳定的排序算法,在最坏情况下,时间复杂度会降级到 O(n2)。

而是采用了一种混合排序的算法:TimSort 。

这种功能算法最初用于Python语言中,严格地说它不属于以上10种排序算法中的任何一种,属于一种混合排序算法:

在数据量小的子数组中使用插入排序,然后再使用归并排序将有序的子数组进行合并排序,时间复杂度为 O(nlogn) 。

 

leetcode:https://leetcode-cn.com/problems/valid-triangle-number/solution/teng-xun-leetcode611you-xiao-san-jiao-xing-de-ge-s/

 

责任编辑:武晓燕 来源: 三分钟学前端
相关推荐

2016-10-20 13:36:28

WebRTC浏览器服务器

2023-04-17 09:01:01

WebGL绘制三角形

2022-03-16 14:27:49

CSS三角形前端

2023-11-01 07:51:15

WebGPU3D 图形

2021-08-29 18:32:18

CSS

2021-07-16 05:59:27

CSS 技巧带圆角的三角形

2024-09-05 11:20:54

2018-03-02 15:54:37

三角形主机比特币

2023-05-06 07:23:57

2024-02-20 18:30:53

CSS属性边框

2022-09-14 15:17:26

ArkUI鸿蒙

2020-12-09 08:34:24

css生成器设计师

2013-09-26 13:43:13

iOS开发OpenGL ES教程图元

2020-04-22 11:19:07

贪心算法动态规划

2021-04-15 06:02:50

CSS 三角形技巧

2012-12-24 09:55:15

iOSUnity3D

2013-09-26 14:09:31

iOS开发OpenGL ES教程绘制矩形

2021-09-24 09:22:26

AI 数据人工智能

2025-03-11 12:07:10

2023-04-26 07:42:16

WebGL图元的类型
点赞
收藏

51CTO技术栈公众号