标签:自己的 highlight strong div max title 数组 sort 长度
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
if(numbers.size()==0) return 0;
sort(numbers.begin(),numbers.end());
int min=numbers[0];
int max=numbers[numbers.size()-1];
int k=max-min;
int t;
vector<int> book(k+1,0);
for(int i=0;i<numbers.size();i++) {
book[numbers[i]]++;
}
for(int j=0;j<k;j++) {
if(book[j]>(numbers.size()/2)) {
t=book[j];
break;
}
}
return t;
}
};
查阅网上另外的思路:
首先第一个for循环结束后得到的num是什么?如果这个数组中存在个数大于数组长度一半的数,那么这个num一定是这个数,因为数组中所有不是num的数,一定会被这个数覆盖,所以最后得到的数是num。但是,如果这个数组中根本不存在个数大于数组长度一半的数,那么这个num就是一个不确定的值,这也是为什么找出num之后,还要再做一次循环验证这个数出现的个数是不是大于数组长度一半的原因。
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
int n=numbers.size();
if(n==0) return 0;
int num=numbers[0],count=1;
for(int i=1;i<n;i++) {
if(numbers[i]==num) count++;
else count--;
if(count==0) {
num=numbers[i];
count=1;
}
}
count=0;
for(int i=0;i<n;i++) {if(numbers[i]== num) count++;}
if(count * 2 >n) return num;
return 0;
}
};
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers)
{
// 因为用到了sort,时间复杂度O(NlogN),并非最优
if(numbers.empty()) return 0;
sort(numbers.begin(),numbers.end()); // 排序,取数组中间那个数
int middle = numbers[numbers.size()/2];
int count=0; // 出现次数
for(int i=0;i<numbers.size();++i)
{
if(numbers[i]==middle) ++count;
}
return (count>numbers.size()/2) ? middle : 0;
}
};
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers)
{
if(numbers.empty()) return 0;
// 遍历每个元素,并记录次数;若与前一个元素相同,则次数加1,否则次数减1
int result = numbers[0];
int times = 1; // 次数
for(int i=1;i<numbers.size();++i)
{
if(times == 0)
{
// 更新result的值为当前元素,并置次数为1
result = numbers[i];
times = 1;
}
else if(numbers[i] == result)
{
++times; // 相同则加1
}
else
{
--times; // 不同则减1
}
}
// 判断result是否符合条件,即出现次数大于数组长度的一半
times = 0;
for(int i=0;i<numbers.size();++i)
{
if(numbers[i] == result) ++times;
}
return (times > numbers.size()/2) ? result : 0;
}
};
标签:自己的 highlight strong div max title 数组 sort 长度
原文地址:http://www.cnblogs.com/dd2hm/p/7373608.html