169. Majority Element
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.
题意:
给定一个大小n的数组,查找大多数元素。大多数元素是在数组中出现超过⌊n / 2⌋次的元素。
您可以假定数组是非空的,而数组中的大多数元素总是存在的。
方法一
思路:
利用hashmap的思想,键用来存储元素的,值用来存储元素出现的次数,然后遍历map取出值最大的那个元素就是出现次数超过n/2的元素。代码如下:
class Solution {
public:
int majorityElement(vector<int>& nums) {
map<int,int> count;
int n=nums.size();
int sz=n/2;
for (int i=0;i<n;++i)
{
if (count[nums[i]])
{
count[nums[i]]++ ;
}
else
count[nums[i]]=1;
}
for (auto iam=count.begin();iam!=count.end();++iam)
{
if ((iam->second)>sz)
{
return iam->first;
}
}
}
};
方法二
思路:
这个方法的效率更高一些,它是利用遍历一次,计数查找元素,不像方法一,需要两次遍历才能找到关键元素。此方法的关键就是利用realVal来记录当前出现元素的值,并且counts来记录此元素出现的次数,向后遍历当遇见和realVal值不相同的时候counts–,相同的时候counts++,如果counts==0的时候说明相同元素和其他元素出现次数相同,更新realVal的值。要查找的元素的个数超过数组总数的n/2,所以最后realVal的值就是出现次数做多的元素。代码如下:
class Solution {
public:
int majorityElement(vector<int>& nums) {
int realVal = 0;
int counts = 0;
for(int i =0;i<nums.size();i++){
if(counts==0){
realVal = nums[i];
counts = 1;
}
else{
if(realVal==nums[i])
counts++;
else
counts--;
}
}
return realVal;
}
};