數組中有一個數字出你可以假設數組是非空的,並且給定的數組總是存在多數元素。
現的次數超過數組長度的一半,請找出這個數字。
示例 1:
輸入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
輸出: 2
思路:
1、題目分析
題目的要求就是要找出數組中出現次數大於數組長度一半的數字。
2、解題分析
這個數字如果出現的次數比數組長度一半都大,那麼肯定是衆數。第一種方法:那麼對這個數組進行排序去中間的數就是這個數字了。第二種方法:採用哈希表去統計每個數字出現的次數然後遍歷哈希表找出出現的次數大於數組長度一半的數組。第三種方法:摩爾投票法。代碼示例:
class Solution:
def majorityElement(self, nums: List[int]) -> int:
#hash法
dic = collections.defaultdict(int)
size = len(nums)/2
for i in nums:
dic[i]+=1
for k,v in dic.items():
if v>size:
return k
#摩爾法
votes = 0
for num in nums:
if votes == 0:
x = num
votes += 1 if num == x else -1
return x
#排序法
return sorted(nums)[len(nums)//2]
時間和空間複雜度依次爲O(N) ,O(Nlog2N)和O(1),O(N)和O(1)。