問題
有一個(gè)歌曲列表,第i
首歌有time[t]
的時(shí)長。返回成對歌曲的數(shù)量楔敌,要求它們時(shí)長之和能被60
整除。即i < j驻谆,(time[i] + time[j]) % 60 = 0
卵凑。
栗子1:
輸入:[30,20,150,100,40]
輸出:3
匹配結(jié)果:
30-150、20-100旺韭、20-40
栗子2:
輸入:[60,60,60]
輸出:3
匹配結(jié)果:
60-60氛谜、60-60、60-60
注意:
1 <= time.length <= 60000
1 <= time[i] <= 500
想看英文的戳這里:原題地址
解題思路
很容易想到的是兩層 for
循環(huán)区端,但既然題目出在這了值漫,自然不可能是暴力循環(huán)法。所以需要從 % 60
上面來思考织盼。
如果 (x + y) % 60 = 0
杨何,則 x % 60 = 60 - y % 60
,其實(shí)這個(gè)規(guī)則就是最主要的解題思路沥邻。
而 x % 60
的范圍是[0, 59]
危虱,60 - y % 60
的范圍是[0, 60]
。所以為了使兩者取值范圍相等唐全,需要將后者%60
埃跷,即x % 60 = (60 - y % 60) % 60
。
所以當(dāng)我們遇到某個(gè)數(shù)t
時(shí)邮利,只需要計(jì)算公式左邊的值的個(gè)數(shù)
有幾個(gè)弥雹,則有幾對。
舉個(gè)栗子延届,比如time = [20, 40, 100, 80]
剪勿。
- 遇到
20
,套用公式右邊計(jì)算出與之匹配的數(shù)%60
的結(jié)果60 - y % 60 = 40
方庭。因?yàn)槭堑谝粋€(gè)數(shù)厕吉,無與之匹配的酱固。 - 遇到
40
,與之匹配的數(shù)%60
的結(jié)果 為20
头朱,存在20
运悲, 共1
個(gè)。 - 遇到
100
髓窜, 與之匹配的數(shù)%60
的結(jié)果 為20
扇苞,存在20
, 共1
個(gè)寄纵。 - 遇到
80
鳖敷,與之匹配的數(shù)%60
的結(jié)果為40
,存在40,100
程拭,共2
個(gè)定踱。
所以我們可以用數(shù)組array
存 t % 60
出現(xiàn)的個(gè)數(shù),遍歷time
數(shù)組恃鞋,直接取出array[(60 - t % 60) % 60]
即為匹配的對數(shù)崖媚。
swift
代碼如下:
func numPairsDivisibleBy60(_ time: [Int]) -> Int {
var count = 0
var array = [Int]()
var i = 0
while i < 60 {
// 初始化為 0
array.append(0)
i += 1
}
for t in time {
count += array[(60 - t % 60) % 60]
// 次數(shù)加1
array[t % 60] += 1
}
return count
}