题目描述:ios
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋
的元素。数组
你能够假设数组是非空的,而且给定的数组老是存在众数。spa
示例:code
输入:[2, 2, 1, 1, 1, 2, 2]blog
输出:2排序
方法一:创建map来记录数组中每一个不重复元素的出现次数,而后遍历map,查找map中value大于n/2的key值,该值即为众数。ci
#include<iostream> #include<vector> #include<map> #include<algorithm> using namespace std; class Solution{ public: int majorityElement(vector<int>& nums){ map<int, int> mapElement; //初始化一个map,其中key表示数组中不重复的元素,value表示该元素在数组中出现的次数 int element; for(int i=0; i<nums.size();++i){ if(mapElement.count(nums[i]) == 0) //查找map中是否包含该元素,若为0,则不包含 mapElement.insert(make_pair(nums[i], 1)); else mapElement[nums[i]] += 1; } map<int, int>::iterator it = mapElement.begin(); while(it != mapElement.end()){ if(it->second > nums.size()/2){ element = it->first; break; } it++; } return element; } }; int main(){ Solution solution; vector<int> vec; int i; do{ cin>>i; vec.push_back(i); }while(getchar() != '\n'); int res; res = solution.majorityElement(vec); cout<<res<<endl; return 0; }
方法二:因为数组中众数必定是数组中出现次数大于n/2的元素,因此咱们将数组排序后,位于数组中间的那个元素必定是众数。element
class Solution{ public: int majorityElement(vector<int>& nums){ sort(nums.begin(), nums.end()); int element = nums[nums.size()/2]; return element; } };
方法三:因为众数是出现次数大于n/2的元素,设置数组中第一个元素为众数,count为1。从第二个元素开始遍历数组,若元素与众数相等,则count+1,若不等,则count-1。当count变为0时,咱们更新众数为下一个元素,count从新置为1.数组遍历完成获得的众数即为所求众数。get
上述方法又称为摩尔投票法,即查找输入中重复出现超过一半以上(n/2)的元素。摩尔投票的思想:在每一轮投票过程当中,从数组中找出一对不一样的元素,将其从数组中删除,这样不断的删除直到没法再进行投票,若是数组为空,则没有任何元素出现的次数超过该数组的一半。若是只存在一种元素,则这个元素即为目标元素。it
class Solution{ public: int majorityElement(vector<int>& nums){ int element = nums[0]; int count = 1; for(int i=1; i<nums.size(); ++i){ if(nums[i] == element) count++; else count--; if(count == 0){ element = nums[++i]; count++; } } return element; } };