Go算法

(14)Go查找表求回旋镖数量

2019-05-14  本文已影响0人  哥斯拉啊啊啊哦
1)暴力解法:时间复杂度O(n^3)

2)查找表
通过题目可以看出每一个点 i 都是一个枢纽,对于每个点 i,遍历其余点到 i 的距离,存储到查找表
时间复杂度O(n^2)
空间复杂度为O((n-1)+(n-2)+...+1) = O(n)
实现
// 时间复杂度O(n^2)
// 空间复杂度最大为O((n-1)+(n-2)+...+1) = O(n)
func numberOfBoomerangs(points [][]int) int {
    count := 0

    for i1, v1 := range points {
        // m[key]val: key为值,val为出现的次数
        m := make(map[int]int)

        for i2, v2 := range points {
            if i1 != i2 {
                m[distance(v1, v2)]++
            }
        }

        // val>1,则有 val * (val - 1) 个三元组
        for _, v := range m {
            if v > 1 {
                count += v * (v - 1)
            }
        }
    }

    return count
}

// 计算两点距离的平方
func distance(a, b []int) int {
    return (a[0]-b[0])*(a[0]-b[0]) + (a[1]-b[1])*(a[1]-b[1])
}

提交leetcode,通过

上一篇下一篇

猜你喜欢

热点阅读