题目描述:
Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.
You may assume that the array is non-empty and the majority element always exist in the array.
根据题目可知,所给的vector中必然会出现一个majority element 的频数大于 n/2,而且是唯一的(不可能同时出现两个频数大于n/2的element),所以,可以通过哈希法(map),以键值对的方式,key记录element,而value记录element的频数,遍历vector,再从map中找出频数最高的element,这样一来其效率是O(n)+O(n/2),而其实我们可以在遍历vector的同时找出频数最高的element,因为一旦频数大于n/2的element出现即可停止遍历(majority element的唯一性)。
算法设计:
int majorityElement(vector<int>& nums) {
map<int, int> buf;
int size = nums.size();
for(int i = 0;i < size; i++) {
buf[nums[i]]++;
if(buf[nums[i]] > size/2)
return nums[i];
}
}
###算法学习借鉴
个人分析:
假如vector中的element总数为 n = 2k+1,则majority element的频数 f 大于 n/2,即大于等于 k+1,假如 n = 2k, 一样的有 f 大于 n/2,即 f 大于等于k+1。因此,在一列数中,不管以何种方式排列,majority element 要么存在相邻,要么以majority element结尾,加上majority element的频数最高,这样一来,通过扫描一遍,扫出来的只会剩下majority element。(有点排列组合的味道)
O(n) time O(1) space fastest solution
public class Solution {
public int majorityElement(int[] num) {
int major=num[0], count = 1;
for(int i=1; i<num.length;i++){
if(count==0){
count++;
major=num[i];
}else if(major==num[i]){
count++;
}else count--;
}
return major;
}
}