一个数组里有一个数重复了n/2多次,找到

思路:既然这个数重复了一半以上的长度,那么排序后,必然占据了 a[n/2]这个位置。

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        return nums[nums.size()/2];
    }
};

线性解法:投票算法,多的票抵消了其余人的票,那么我的票一定还有剩的。

int majority;
    int cnt = 0;
    for(int i=0; i<num.size(); i++){
        if ( cnt ==0 ){
            majority = num[i];
            cnt++;
        }else{
            majority == num[i] ? cnt++ : cnt --;
            if (cnt >= num.size()/2+1) return majority;
        }
    }
    return majority;

  

Majority Element II:

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.

思路:

窗口(n/3)检查算法。先排序,然后用一个长度为n/3的窗口来检查两端的数是否相等。

class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {
        vector<int> res;
        int maj_ele;
        int len=nums.size();
        sort(nums.begin(),nums.end());
        int index=0;
        while(index<len)
        {
            maj_ele = nums[index];
            if(maj_ele == nums[index+len/3])
            {
                res.push_back(maj_ele);
                while(index<len && maj_ele == nums[++index])
                ;
            }
            else
            {
                
                index++;
            }
        }
        return res;
    }
};