Leetcode:多數(shù)元素
每日一題,讓你身心疲憊!
不要擔心,后續(xù)的痛苦還有很多!
題目:
給定一個大小為 n 的數(shù)組,找到其中的多數(shù)元素。多數(shù)元素是指在數(shù)組中出現(xiàn)次數(shù) 大于 ? n/2 ? 的元素。你可以假設數(shù)組是非空的,并且給定的數(shù)組總是存在多數(shù)元素。
leetcode地址:https://leetcode-cn.com/problems/majority-element/
示例 1:
輸入:[3,2,3]
輸出:3
解題思路:
1、哈希
首先就可以想到用哈希去做一個暴力解法
?public?int?majorityElement(int[]?nums)?{
????int?len?=?nums.length;
????int?moreLen?=?len?/?2?;
????int?result?=?nums[0];
????Map?tmpMap?=?new?HashMap<>();
????for?(int?i?=?0;?i?????????Integer?currNum?=?tmpMap.getOrDefault(nums[i],?0)?+?1;
????????tmpMap.put(nums[i],??currNum);
????????if?(currNum?>?moreLen)?{
????????????return?nums[i];
????????}
????}
????return?result;
}

2、排序
既然是尋找出現(xiàn)次數(shù)大于 n/2 的數(shù)字,那么可以對數(shù)組先進行排序,然后中間的數(shù)字就是正解了。
?public?static?int?majorityElement(int[]?nums)?{
????????Arrays.sort(nums);
????????return?nums[nums.length?/?2];
????}

3、摩爾投票法
將目標數(shù)字(target_num)初始化為nums[0],票數(shù)count初始化為1。
當遇到與target_num相同的數(shù),則票數(shù)count = count + 1,否則票數(shù)count = count - 1。
當票數(shù)count為0時,更換候選人,并將票數(shù)count重置為1。
遍歷完數(shù)組后,target_num即為最終答案。
解釋:
投票法是遇到相同的則票數(shù) + 1,遇到不同的則票數(shù) - 1。
且“多數(shù)元素”的個數(shù)> ? n/2 ?,其余元素的個數(shù)總和<= ? n/2 ?。
因此“多數(shù)元素”的個數(shù) - 其余元素的個數(shù)總和 的結(jié)果 肯定 >= 1。
這就相當于每個“多數(shù)元素”和其他元素 兩兩相互抵消,抵消到最后肯定還剩余至少1個“多數(shù)元素”。
public?int?majorityElement(int[]?nums)?{
????int?cand_num?=?nums[0],?count?=?1;
????for?(int?i?=?1;?i?????????if?(cand_num?==?nums[i])
????????????++count;
????????else?if?(--count?==?0)?{
????????????cand_num?=?nums[i];
????????????count?=?1;
????????}
????}
????return?cand_num;
}

總結(jié):
從上可以看到,解題效率是:投票法 > 排序法 > 哈希法
算法主要在于思維方式,可能一開始我們只能想到的是暴力解法,有問題嗎?沒有問題,能解出來叫牛逼,沒解出來叫事故。此時也不要懊惱,可以看看別人的解法,或許可以讓你茅塞頓開,后續(xù)多加練習,遇到相同題型自然就會有思路了。
最后:周末愉快!
