給定一個紅包的金額陣列gifts及它的大小n,請返回所求紅包的金額。若沒有金額超過總數的一半,返回0。
測試樣例:
[1,2,3,2,2],5
返回:
2
思路;考慮到題目要求演算法儘可能高效,所以放棄使用hashtable計數比較來做
使用相同則增一計數,相異則減一計數,設序列首部值為key,count = 1
然後從序列第二個值開始迴圈,每次迴圈元素與key比較,如果相同,則count++
不同則,count–,直到count變為-1,則考慮此時的元素為key,繼續從當前位置迴圈直到序列結束
這篇文章看到這裡小編給大家分享一個java大牛的微信:dongnaobest20,歡迎大家一起來交流學習,我們們不看技術怎麼樣,小編都歡迎,不定期分享乾貨,包括我自己整理的一份2018最新JAVA資料。
例子如下:
例如 4 4 2 3 4
文字 - 首先,key = 4 ,count = 1,第二個4與key相同,count增加1,變為2
然後2 3分別與key不同,count減去2,變為0
最後4與key相同,count++,變為1
輸出結果是4
這樣看起來好像沒什麼問題,但是如果出現以下情況呢?
例如 4 4 4 3 3 2 2 1 1
首先key = 4 ,count為1,經過另外兩個4,key還是4,count變為3
經過 3 3 2 ,key為4,count為0
接著經過2 ,key為4,count為-1,此時考慮變換key為2,count為1
接著經過1,key為2,count為0
接著經過1,key為2,count為-1,此時考慮變換key為1,count為1
所以結果是1
但是這個序列裡1明顯不是超過一半的
這是為什麼呢?因為在這有點像 鷸蚌相爭漁翁得利,4 3 2分別爭寵,最後1收了漁網~
那怎麼避免呢?
在第一次迴圈後將最後的key再次帶入第二次迴圈,和序列元素比較
為了區別count,使用flag作為計數器,初始化為1
當遍歷序列時,相同則flag++,不同則flag–
當序列比較結束,看flag是否大於等於1,如果是,則超過一半,輸出key
如果不是,輸出None
程式碼實現如下:
(gifts用list相關名稱表示)
多個測試資料:
注意list_4 呼叫函式返回值0,即找不到超過一半數量的數字~
最後附上大牛二維碼領取全套java資料噢~