39.數組中出現次數超過一半的數字
面試題39. 數組中出現次數超過一半的數字
難度簡單19
數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。
你可以假設數組是非空的,並且給定的數組總是存在多數元素。
示例 1:
輸入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 輸出: 2
1.哈希表
//哈希表
//1.將數組中元素作爲key value爲出現的次數
//2.遍歷哈希表中所有key 找出出現最大的次數
// time :O(n) 遍歷數組n次
// space : 將元素存儲到哈希表中所佔用的空間
public int majorityElement(int[] nums) {
if(nums == null || nums.length == 0){
return -1;
}
Map<Integer,Integer> results = new HashMap<>();
for(int i=0;i<nums.length;i++){
if(!results.containsKey(nums[i]))
results.put(nums[i],1);
else
results.put(nums[i],results.get(nums[i])+1);
}
Map.Entry<Integer, Integer> majorityEntry = null;
for (Map.Entry<Integer, Integer> entry : results.entrySet()) {
if (majorityEntry == null || entry.getValue() > majorityEntry.getValue()) {
majorityEntry = entry;
}
}
return majorityEntry.getKey();
}
2.排序
// time : (OlogN) 數組排序需要的時間
// space : (logN) 數組排序需要的外部存儲空間 語言自身的排序空間是OlogN
// ps : 當數組中有大於一半以上的數據時,如果將數組進行排序,那麼中間下標位置一定是衆數的下標。
// 無論是偶數 還是 奇數。
// 衆數 : 在一組數據中出現次數最多的數字。
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length/2];
}
3.Boyer-Moore 投票算法
// Boyer-Moore 投票算法
// 核心思想
// 如果候選人不是maj 則 maj,會和其他非候選人一起反對 會反對候選人,所以候選人一定會下臺(maj==0時發生換屆選舉)
// 如果候選人是maj , 則maj 會支持自己,其他候選人會反對,同樣因爲maj 票數超過一半,所以maj 一定會成功當選
// time : O(n) 一次loop array
// space : O(1)
public int majorityElement(int[] nums) {
if(nums == null || nums.length == 0) return -1;
int count = 0;
Integer candidate = null;
for(int num : nums){
if(count == 0){
candidate = num;//更換候選人
}
//count += ((num == candidate) ? 1 : -1);
count += (num == candidate) ? 1 : -1;
}
return candidate;
}