題目描述 :
數組中佔比超過一半的元素稱之爲主要元素。給定一個整數數組,找到它的主要元素。若沒有,返回-1。
示例 1:
輸入:[1,2,5,9,5,9,5,5,5]
輸出:5
示例 2:
輸入:[3,2]
輸出:-1
示例 3:
輸入:[2,2,1,1,1,2,2]
輸出:2
說明:
你有辦法在時間複雜度爲 O(N),空間複雜度爲 O(1) 內完成嗎?
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/find-majority-element-lcci
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
解答:
int majorityElement(int* nums, int numsSize)
{
int count = 1;
int major = nums[0];
int i = 0;
for(i = 1;i < numsSize;i++)
{
if(major == nums[i])
{
count++;
}
else
{
count--;
}
if(0 == count)
{
count = 1;
major = nums[i];
}
}
for(i = 0; i < numsSize;i++)
{
if(major == nums[i])
{
count++;
}
}
return count > numsSize / 2 ? major:-1;
}
運行結果:
Notes:
使用摩爾投票法。摩爾投票法適用於找出一組數字序列中出現次數大於總數1/2的數字,每次從數組中選擇兩個不相同的數字刪掉,剩下的數字就是就是出現次數超過一半的數字。因爲數字總數要大於1/2,所以不管數組是否亂序排列,總會存在出現最多的數字相鄰排列以及該數字的總數要比該數組長度的一半要長,並且只有一個符合這兩個條件的數字。另外需要注意的是相同數字的相鄰長度越長並不一定意味着是出現最多的數字,比如[5,2,5,6,5,5,1,5,1]符合條件而[5,2,5,6,5,5,1,1,1]雖然1的相鄰長度最長但並不滿足長度佔總長一半,所以不符合條件。