229.Majority Element II

August 16, 2016

229.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.

Hint:

How many majority elements could it possibly have?

这道题是Majority Element系列的第二题,要求O(n)的时间复杂度和O(1)的空间复杂度,题目中给出了暗示,要求先考虑一个序列中最多有多少个出现次数能超过1/3的元素,根据反证法,如果有三个符合要求的元素,那么数组的长度就不可能是n了,所以符合要求的元素最多有两个,但是最开始我并没能够从这个暗示里读出有价值的信息。

直到后来看了讨论区的答案才受到了启发,之前用过的majority voting algorithm是用来寻找出现次数过半的元素的,由于过半的元素只能有一个,所以只需要有一个count来统计投票就够了,这道题只不过是把可能符合条件的数变为2个,再加上一个count不就可以统计两个候选元素的得票状况了吗?其余步骤完全和之前相同。 代码如下:

class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {
        int curIndex1=0,curIndex2=0,count1=0,count2=0;
        int size=nums.size(),i=0,tri=size/3;
        vector<int>res;
        for(i=0;i<nums.size();i++){
            if(nums[i]==nums[curIndex1])
                count1++;
            else if(nums[i]==nums[curIndex2])
                count2++;
            else if(!count1){
                count1=1;
                curIndex1=i;
            }
            else if(!count2){
                count2=1;
                curIndex2=i;
            }
            else{
                count1--;
                count2--;
            }
        }
        count1=0;
        count2=0;
        for(i=0;i<nums.size();i++){
            if(nums[i]==nums[curIndex1])
                count1++;
            else if(nums[i]==nums[curIndex2])
                count2++;
        }
        if(count1>tri)
            res.push_back(nums[curIndex1]);
        if(count2>tri)
            res.push_back(nums[curIndex2]);
        return res;
    }
};

北邮教务系统评教脚本

Published on September 17, 2017

72.Edit distance

Published on September 17, 2017