您的位置:首页 > 其它

Majority Element

2016-05-11 09:22 302 查看


这道题直观的思路是对数组直接排序,排序后中间位置的元素就是要求的元素,时间复杂度是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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: