42.leetcode题目: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.

分析:

这题在剑指offer上看到过,剑指offer上还没有说明这个数字一定存在,所以在寻找结束后,还要判断这个数字是否超过了总长度的一半

根据快速排序来做,出现次数超过一半的数字必定位于正中间。

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int n=nums.size();
        int start=0,end=n-1,middle=(n)/2;
        int index=Partition(nums,n,start,end);
        while(index!=middle){
        if(index<middle){
            start=index+1;
            index=Partition(nums,n,start,end);
        }
        else{
            end=index-1;
            index=Partition(nums,n,start,end);
        }
        }
        return nums[index];
    }
    int Partition(vector<int>&data,int length,int start,int end){
        //if(data.empty()||length<=0||start<0||end>=length)
        //return -1;
        //int middle=(start+end)/2;
        int index=start-1;
        //swap(data[middle],data[end]);
        for(int i=start;i<end;++i){
            if(data[i]<data[end]){
            ++index;
            if(index!=i)
            swap(data[index],data[i]);
            }
        }
        ++index;
        swap(data[end],data[index]);
        return index;
    }
};

40ms。

看到讨论里别人做的,有很巧妙的,:每找到两个不一样的数字则成对删除,最后剩下的数字就是要找的数字。


你可能感兴趣的:(42.leetcode题目:169. Majority Element(还有一种方法待做))