這是小川的第377次更新,第405篇原創
java
今天介紹的是LeetCode算法題中Easy級別的第239題(順位題號是1010)。在歌曲列表中,第i首歌曲的持續時間爲[i]秒。算法
返回其總持續時間(以秒爲單位)可被60整除的歌曲對的數量,即當i <j
時,(time[i] + time[j])%60 == 0
。數組
例如:數據結構
輸入:[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):總持續時間60code
輸入:[60,60,60]
輸出:3
說明:全部三對的總持續時間爲120,可被60整除。get
注意:for循環
1 <= time.length <= 60000class
1 <= time[i] <= 500
數據結構與算法
暴力解法,使用兩層for循環,可是會超時。循環
public int numPairsDivisibleBy60(int[] time) { int count = 0, n = time.length; for (int i=0; i<n; i++) { for (int j=i+1; j<n; j++) { if ((time[i]+time[j])%60 == 0) { count++; } } } return count; }
咱們須要將時間複雜度降到O(N)
,就得從新考慮time
中的元素值特性。
例如[30,20,150,100,40]
,其中30和150能夠配對,20和100能夠配對,20和40能夠配對,這三對數之和均可以被60整除,那咱們能夠事先就將這些數簡化一步,對60取餘,獲得[30,20,30,40,40]
,新的數範圍是[0,59]
,那麼只要後面出現的數能在前面找到一個數,二者互補(即二者之和等於60的倍數),即60-temp = temp2;
temp2
在temp
的後面出現,變成僞代碼就是60-time[i]%60
。
可是換到另一個例子上來看,[60,60,60]
,取餘後變成了[0,0,0]
,再用60去減,發現沒有能夠配對的數,那咱們就再取餘一次,即(60-time[i]%60)%60
,這樣就能夠處理那些自己是60的倍數的數。
思路:先對time
中的數用60進行取餘運算,使用一個HashMap
,key
爲新數組的元素值,value
爲出現次數,遍歷新數組中的元素num
,找到(60-num)%60
在HashMap
中的value
值,進行累加,最後輸出。
public int numPairsDivisibleBy602(int[] time) { for (int i=0; i<time.length; i++) { time[i] %= 60; } int count = 0; Map<Integer, Integer> map = new HashMap<Integer,Integer>(); for (int num : time) { count += map.getOrDefault((60-num)%60, 0); map.put(num, map.getOrDefault(num, 0)+1); } return count; }
思路和第二種解法同樣,將HashMap
換成int
數組。
public int numPairsDivisibleBy603(int[] time) { int[] count = new int[60]; int result = 0; for (int num : time) { result += count[(60-num%60)%60]; count[num%60]++; } return result; }
算法專題目前已連續日更超過七個月,算法題文章245+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。
以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,好看、留言、轉發就是對我最大的回報和支持!