为有牺牲多壮志,敢教日月换新天。

[Swift]LeetCode1128. 等价多米诺骨牌对的数量 | Number of Equivalent Domino Pairs

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/11179560.html 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

Given a list of dominoesdominoes[i] = [a, b] is equivalent to dominoes[j] = [c, d] if and only if either (a==c and b==d), or (a==d and b==c) - that is, one domino can be rotated to be equal to another domino.

Return the number of pairs (i, j) for which 0 <= i < j < dominoes.length, and dominoes[i] is equivalent to dominoes[j].

Example 1:

Input: dominoes = [[1,2],[2,1],[3,4],[5,6]]
Output: 1

Constraints:

  • 1 <= dominoes.length <= 40000
  • 1 <= dominoes[i][j] <= 9

给你一个由一些多米诺骨牌组成的列表 dominoes

如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌,我们就认为这两张牌是等价的。

形式上,dominoes[i] = [a, b] 和 dominoes[j] = [c, d] 等价的前提是 a==c 且 b==d,或是 a==d 且 b==c

在 0 <= i < j < dominoes.length 的前提下,找出满足 dominoes[i] 和 dominoes[j] 等价的骨牌对 (i, j) 的数量。

示例:

输入:dominoes = [[1,2],[2,1],[3,4],[5,6]]
输出:1

提示:

  • 1 <= dominoes.length <= 40000
  • 1 <= dominoes[i][j] <= 9

192ms
 1 class Solution {
 2     func dominoHash(_ dom:[Int]) -> Int {
 3         if dom[0] > dom[1] {
 4             return 100*dom[1] + dom[0]
 5         }
 6         return 100*dom[0] + dom[1]
 7     }
 8 
 9     func numEquivDominoPairs(_ dominoes: [[Int]]) -> Int {
10         var result = 0
11         var counts = [Int : Int]()
12         
13         for d in dominoes {
14             let h = dominoHash(d)
15             if let count = counts[h] {
16                 result += count
17                 counts[h] = count + 1
18             } else {
19                 counts[h] = 1
20             }
21         }
22         return result
23     }
24 }

196ms

 1 sample 196 ms submission
 2 class Solution {
 3     func numEquivDominoPairs(_ dominoes: [[Int]]) -> Int {
 4         var originals = [Int]()
 5 
 6         dominoes.forEach { (domino) in
 7             originals.append(10*min(domino[0], domino[1]) + max(domino[0], domino[1]))
 8         }
 9 
10         var counts: [Int: Int] = [:]
11         originals.forEach { counts[$0, default: 0] += 1 }
12 
13         var count = 0
14         counts.forEach { count = count + ( $1 * ($1 - 1)/2 ) }
15 
16         return count
17     }
18 }

200ms

 1 class Solution {
 2     func numEquivDominoPairs(_ dominoes: [[Int]]) -> Int {
 3         let dominoes = dominoes.map { dom -> Int in
 4             if dom[0] <= dom[1] {
 5                 return dom[0] * 10 + dom[1]
 6             } else {
 7                 return dom[1] * 10 + dom[0]
 8             }
 9         }
10         var counts = [Int: Int]()
11         var res = 0
12         for num in dominoes {
13             res += (counts[num] ?? 0)
14             counts[num, default: 0] += 1
15         }
16         return res
17     }
18 }

Runtime: 224 ms

Memory Usage: 23.9 MB
 1 class Solution {
 2     func numEquivDominoPairs(_ dominoes: [[Int]]) -> Int {
 3         var dominoes = dominoes
 4         var freq:[[Int]:Int] = [[Int]:Int]()
 5         var total:Int = 0
 6         for i in 0..<dominoes.count
 7         {
 8             if dominoes[i][0] > dominoes[i][1]
 9             {
10                 dominoes[i].swapAt(0,1)
11             }
12             total += freq[[dominoes[i][0], dominoes[i][1]],default:0]
13             freq[[dominoes[i][0], dominoes[i][1]],default:0] += 1
14         }
15         return total
16     }
17 }

 

posted @ 2019-07-13 10:00  为敢技术  阅读(349)  评论(0编辑  收藏  举报