題目:
給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列**現次數大於 ⌊ n/2 ⌋ 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。
分析:1、多數元素即在一組數**現次數大於 ⌊ n/2 ⌋ 的元素
2、多數元素在這個陣列中一定存在
這兩個條件就決定了這種多數元素一定只可能是一種數,因為它出現的次數大於總數的一半,所以只可能是一種數,不可能是兩種或者多種。
解法:1、雜湊表
利用雜湊表結構,以陣列元素值作為雜湊表的key,出現的次數作為value,進行統計,最後比較哪個value值最大,對應的key就是這個多數元素。這個需要額外的空間,時間複雜度和空間複雜度都是o(n)
2、排序
分析一下,對這個陣列進行從小到達排序,因為多數元素一定存在,所以這個經過排序後的陣列,多數元素一定會在n/2這個位置出現,因為它出現頻次已經大於一半了,無論將這一組相同的數放置在有序陣列的哪些連續位置,都是會經過n/2位置的,所以可以對原陣列排序,然後直接返回位於n/2位置的元素。
3、摩爾投票演算法
具體落實到演算法的實現就是,定義乙個計數變數count,乙個變數cur_max表示它是當前的多數元素,初始值設定為count = 1,cur_max = num[0]。然後從第二個元素開始遍歷陣列,如果遇到的元素和當前多數元素cur_max相同,就count++,如果不同,那就是出現了兩個不同的元素,就要進行抵消,就是count--;在遍歷的過程中,如果count變為0了那麼就要更改cur_max變數的值了,更改為當前正在訪問的陣列值。最後cur_max值就是多數元素。
**1,雜湊表:
public int majorityelement(int nums)
if (map.get(nums[i]) > maxcount)
maxcount = map.get(nums[i]);
}for (int j : nums)
return maxnumber;
}
**2,排序:
public int majorityelement(int nums)
**3,摩爾投票演算法:
public int majorityelement(int nums) else
}return majority;
}
參考:cyc2018 力扣169題 多數元素
leetcode刷題筆記 給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列 現次數 大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。示例1輸入 3,2,3 輸出 3 示例2輸入 2,2,1,1,1,2,2 輸出 2 題目上說給定的陣列總是存在多數元素,...
力扣169 多數元素
給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列 現次數大於 n 2 的元素。可以假設陣列不為空,並且一定存在多數元素 示例 示例 1 輸入 3,2,3 輸出 3 示例 2 輸入 2,2,1,1,1,2,2 輸出 2 解題思路 如果乙個陣列中有有乙個數大於陣列元素的一半,那麼那這個...
力扣解題思路 169 多數元素
思路 給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列 現次數大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。首先最直觀的方法就是先排序,最中間那個數出現次數一定多於 n 2。public intmajorityelement int nums 這種方...