思路:
1、最直观的一种方法就是:用快速排序的思想 找出位于中间位置的那个数;时间复杂度为 nlogn;
然后就是再查找这个数的个数是不是大于总个数的一般;
2、就是设置两个变量times=0;res=nums[0];
如果说遇到的下一个数与res不同 则times--;
如果说相同的话 就times++;
来下面上代码:
class Solution {
public:
//方法一:times比较个数的巧方法;
int MoreThanHalfNum_Solution(vector<int> nums)
{
if(nums.empty())return 0;
int times=0;
int res=nums[0];
for(auto i:nums)
{
if(i==res)//相同的话 times++;
times++;
else //不同的话 times--;
{
times--;
if(times==0)
{
res=i;更新res的值;
times=1;//更新times的值;
}
}
}
int counts=0;
for(auto i:nums)//统计它出现的次数;
if(i==res)
counts++;
return 2*counts>nums.size()?res:0;
}
private:
//方法二:最常规的 快速排序的方法;
int partition(vector<int>&nums,int left,int right)
{
if(nums.empty()||right<left)return 0;
int pivort=nums[left];
while(left<right)
{
while(left<right&&nums[left]<=pivort)
left++;
swap(nums[left],nums[right]);
while(left<right&&nums[right]>=pivort)
right--;
swap(nums[left],nums[right]);
}
return left;
}
public:
int MoreThanHalfNum_Solution(vector<int> nums)
{
if(nums.empty())return 0;
int left=0;
int right=nums.size()-1;
int mid=(right-left)/2+left;
int index=partition(nums,left,right);
while(index!=mid)
{
if(index>mid)
{
right=index-1;
index=partition(nums,left,right);
}
else
{
left=index+1;
index=partition(nums,left,right);
}
}
int res=nums[index];
int times=0;
for(auto i:nums)
{
if(i==res)
times++;
}
return times*2>nums.size()?res:0;
}
};