题目:
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。
看到讨论里别人做的,有很巧妙的,:每找到两个不一样的数字则成对删除,最后剩下的数字就是要找的数字。