想来还是把代码写到csdn吧,放在github上查看不方便
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
//方法1
//对所有ID排序,再扫描排序后的ID列表,统计各个ID出现的次数,如果某个ID出现的次数超过一半输出这个ID
//方法2
//排序后那个数一定是n/2位置的数
//方法3
//哈希数组保存统计次数
//方法4
//避免排序,每次删除两个不同的ID(可能包含重复的数字),这样剩下的数组中那个数的次数仍然是超过总数的一半,不断重复,把ID列表的ID降低,最后得到答案。
//思想就是,遇到不一样就删除,两个两个删除,最后多出来的一定是个数拆过数组长度一半的那个值
int nTimes=0;//记录相同的次数,然后遇见不一样的就递减,当为0时存入下一个数,nTimes=1
int candidate;
for(unsigned int i=0;i<numbers.size();i++)
{
if(nTimes==0)
{
candidate=numbers[i];
nTimes=1;
}
else
{
if(candidate!=numbers[i])
nTimes--;
else
nTimes++;
}
}
nTimes=0;
for(unsigned int i=0;i<numbers.size();i++)
if(numbers[i]==candidate)
nTimes++;
if(nTimes<=(int)numbers.size()/2)
return 0;//验证,牛客网上的样列并没有超过数组长度一半的那个值
return candidate;
}
};
//方法5
//排序后我们可以得到数组中间的那个值一定是那个超过一半的数,但是我们避免排序的话,也就是求第k/2大的数
class Solution {
public:
bool check(vector<int>& numbers,int k)
{
int number=0;
for(int i=0;i<numbers.size();i++)
if(numbers[i]==k)
number++;
if(number<=(int)numbers.size()/2)
return false;
else
return true;
}
int partition(vector<int>& numbers,int start,int end)
{
int pivat=start;
swap(numbers[pivat],numbers[end]);
int small=start-1;
for(int i=start;i<end;i++)
{
if(numbers[i]<numbers[end])
{
small++;
if(small!=i)
swap(numbers[small],numbers[i]);
}
}
small++;
swap(numbers[small],numbers[end]);
return small;
}
int MoreThanHalfNum_Solution(vector<int> numbers) {
//小姑娘来撸个快排
if(numbers.size()<1)
return 0;
unsigned int length=numbers.size();
int start=0;
int end=(int)length-1;
unsigned int index=partition(numbers,start,end);
while(index!=length/2)
{
if(index==length/2)
return numbers[index];
else if(index<length/2)
{
start=index+1;
index=partition(numbers,start,end);
}
else
{
end=index-1;
index=partition(numbers,start,end);
}
}
if(check(numbers,numbers[index]))
return numbers[index];
else
return 0;
}
};