Majority Element

这道题直观的思路是对数组直接排序,排序后中间位置的元素就是要求的元素,时间复杂度是O(nlogn)。

但是还有更快的解法,基于快速排序中partition函数的O(n)算法。快速排序的partition函数有两种解法,一种是“两个下标分别从首尾向中间扫描”,另一种是“两个指针索引一前一后逐步向后扫描”。在leetcode中,只有后一种方法可以满足时时间复杂度的要求,这两种方法在时间复杂度上的区别,我还没有完全想清楚。

class Solution {
public:
    int partition(vector<int>& nums,int begin,int end)
    {
        int i=begin-1;
        for(int j=begin;j<end;j++)
        {
            if(nums[j]<nums[end])
            {
                i++;
                int temp=nums[j];
                nums[j]=nums[i];
                nums[i]=temp;
            }
        }
        i++;
        int temp=nums[end];
        nums[end]=nums[i];
        nums[i]=temp;
        
        return i;
    }
    
    int majorityElement(vector<int>& nums) {
        int begin=0;
        int end=nums.size()-1;
        int index=partition(nums,begin,end);
        int mid=(nums.size()-1)/2;
        
        while(index!=mid)
        {
            if(index<mid)
            {
                begin=index+1;
                index=partition(nums,begin,end);
            }
            else if(index>mid)
            {
                end=index-1;
                index=partition(nums,begin,end);
            }
        }
        
        return nums[index];
    }
};
//快速排序partition的另一种解法
int
partition(vector<int>& nums,int begin,int end) { int pivot=nums[begin]; while(begin<end) { while(begin<end&&pivot<=nums[end]) end--; nums[begin]=nums[end]; while(begin<end&&pivot>=nums[begin]) begin++; nums[end]=nums[begin]; } nums[begin]=pivot; return begin; }

还有一种更简单的O(n)方法,通过在遍历数组时,计算数字出现的次数来获得最后的result。

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int result=nums[0];
        int time=1;
        for(int i=1;i<nums.size();i++)
        {
            if(time==0)
            {
                result=nums[i];
                time=1;
            }
            else if(result==nums[i])
                time++;
            else
                time--;
        }
        
        return result;
    }
};

 

posted on 2016-05-11 09:22  summerkiki  阅读(152)  评论(0编辑  收藏  举报