找找相似三角形

141 阅读1分钟

前言

昨日周天,做了一个关于相似三角形的竞赛题,发现竟然可以用我前几天写的计算地图的聚合点的方法来做,简直不谋而合。可见算法也是相通的,人生没有哪一步是白走的。

题目

有n组三条边的边长(n<10000),去掉不能构成三角形者,如果存在相似三角形则只保留最前面一个

输入:[[3,4,5], [6,8,10], [12,16,20], [1,2,3], [5,12,13]]
输出:[[3,4,5], [5,12,13]]

题解

  1. 利用三角形的任意两边之和大于第三边,判断是否构成三角形,生成全新数组
  2. 利用相似三角形的三边对应成比例,判断是否为相似三角形,塞进对应数组里
  3. 将所有的相似三角形聚合在一起,找出在新数组中对应索引,并删除掉
const getResult = (arr)=>{
    // 1.判断是否构成三角形,生成全新数组
    let newArr = []
    arr.forEach(item=>{
        let a = item[0]
        let b = item[1]
        let c = item[2]
        if(a+b>c && a+c>b && b+c>a){
            newArr.push(item) 
        }
    })
    
    // 2.判断是否为相似三角形,塞进对应数组里
    let index = 1
    let arrMapList = []
    for(let i=0;i<newArr.length;i++){
        arrMapList.push([])
    }
    for(let i=0;i<newArr.length;i++){
        index = index == i ? i+1 : index
        for(let j=index;j<newArr.length;j++){
          let ratio1 = newArr[i][0] / newArr[j][0]
          let ratio2 = newArr[i][1] / newArr[j][1]
          let ratio3 = newArr[i][2] / newArr[j][2]
          if(ratio1 == ratio2 && ratio2 == ratio3){
             arrMapList[i].push(newArr[j])
             index = j +1
          } 
        }
    }
    
    // 3.找出在新数组中对应索引,并删除掉多余的相似三角形
    arrMapList.forEach(item=>{
        item.forEach(it=>{
            let ind = newArr.indexOf(it)
            newArr.splice(ind,1)
        })
    })
    return newArr
}
// 测试用例
let arr1 = [[3,4,5], [6,8,10], [12,16,20], [1,2,3], [5,12,13]]
console.log(getResult(arr1))
// [ [ 3, 4, 5 ], [ 5, 12, 13 ] ]
let arr2 = [[7,8,12], [36,48,60], [12,16,20], [50,120,130], [5,12,13]]
console.log(getResult(arr2))
// [ [ 7, 8, 12 ], [ 36, 48, 60 ], [ 50, 120, 130 ] ]

结语

如果无能为力,只管悄悄努力,也许某一天,一切刚刚好。