在歌曲列表中,第 i 首歌曲的持續時間為 time[i] 秒。
返回其總持續時間(以秒為單位)可被 60 整除的歌曲對的數量。形式上,我們希望索引的數字 i 和 j 滿足 i < j 且有 (time[i] + time[j]) % 60 == 0。
示例 1:輸入:[30,20,150,100,40]
輸出:3
解釋:這三對的總持續時間可被 60 整數:
(time[0] = 30, time[2] = 150): 總持續時間 180
(time[1] = 20, time[3] = 100): 總持續時間 120
(time[1] = 20, time[4] = 40): 總持續時間 60
示例 2:方法1:輸入:[60,60,60]
輸出:3
解釋:所有三對的總持續時間都是 120,可以被 60 整數。
/**方法1:雙層迴圈暴力求解
** 時間複雜度:o(n2)
* 空間複雜度:o(1)
*/public
intnumpairsdivisibleby60method1
(int
time)}}
return count;
}
方法2:
/**方法二:餘數法
* 思路:
* 1.整數對60取模,可能有60種餘數。故初始化乙個長度為60的陣列,統計各餘數出現的次數。
* 2.遍歷time陣列,每個值對60取模,並統計每個餘數值(0-59)出現的個數。因為餘數部分需要找到合適的cp組合起來能被60整除。
* 3.餘數為0的情況,只能同餘數為0的情況組合(如60s、120s等等)。0的情況出現k次,則只能在k中任選兩次進行兩兩組合。用k * (k - 1) / 2表示。
* 4.餘數為30的情況同上。
* 5.其餘1與59組合,2與58組合,故使用雙指標分別從1和59兩頭向中間遍歷。1的情況出現m次,59的情況出現n次,則總共有m*n種組合。
* 時間複雜度:o(n)
* 空間複雜度:o(1)
*/public
static
intnumpairsdivisibleby60method2
(int
time)
//統計餘數為0
count += seconds[0]
*(seconds[0]
-1)/
2;//統計餘數為30
count += seconds[30]
*(seconds[30]
-1)/
2;//統計其他
int i =
1,j =59;
while
(i < j)
return count;
}
總持續時間可被 60 整除的歌曲
總持續時間可被 60 整除的歌曲 在歌曲列表中,第 i 首歌曲的持續時間為 time i 秒。返回其總持續時間 以秒為單位 可被 60 整除的歌曲對的數量。形式上,我們希望索引的數字 i 和 j 滿足 i j 且有 time i time j 60 0。示例 1 輸入 30,20,150,100,4...
總持續時間可被60整除的歌曲
在歌曲列表中,第 i 首歌曲的持續時間為 time i 秒。返回其總持續時間 以秒為單位 可被 60 整除的歌曲對的數量。形式上,我們希望索引的數字 i 和 j 滿足 i j 且有 time i time j 60 0。示例 1 輸入 30,20,150,100,40 輸出 3 解釋 這三對的總持續...
1010 總持續時間可被 60 整除的歌曲
1010.總持續時間可被 60 整除的歌曲 1010.總持續時間可被 60 整除的歌曲 我們可以用map將每個數對應的取模結果還有個數存起來,這樣i從 1,30 map i map 60 i 就是一部分的解了,這樣就不用考慮順序了,每種情況這樣相乘就行了,還有當i 30的時候,就是n n 1 2的結...