[leetcode] 169. Majority Element

来源:互联网 发布:如果注册域名 编辑:程序博客网 时间:2024/06/07 08:07

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;    }};
0 0
原创粉丝点击