题目描述
示例:
题目分析:
思路一:定义map,使用<数字,次数>的映射关系,最后统计每个字符出现的次数 思路二:排序,出现次数最多的数字,一定在中间位置。然后检测中间出现的数字出现的次数是否符合要求 思路三:目标条件:目标数据超过数组长度的一半,那么对数组,我们同时去掉两个不同的数字,到最后剩下的一个数就是 该数字。如果剩下两个,那么这两个也是一样的,就是结果),在其基础上把最后剩下的一个数字或者两个回到原来数组中, 将数组遍历一遍统计一下数字出现次数进行最终判断。
代码
思路一:
C
int MoreThanHalfNum_Solution(int* numbers, int numbersLen ) {
int arr[10001] = {0};
for(int i = 0;i<numbersLen;i++)
arr[numbers[i]]++;
for(int i = 0;i<10001;i++)
if(arr[i] > numbersLen/2)
return i;
return -1;
}
C++
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
unordered_map<int, int> map;
int half = numbers.size() / 2;
for (int i = 0; i < numbers.size(); i++) {
auto it = map.find(numbers[i]);
if (it != map.end()) {
map[numbers[i]]++;
}
else map.insert(make_pair(numbers[i], 1));
if (map[numbers[i]] > half) {
return numbers[i];
}
}
return 0;
}
};
思路二:
C
int cmp(const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int MoreThanHalfNum_Solution(int* numbers, int numbersLen )
{
qsort(numbers,numbersLen,sizeof(int),cmp);
return numbers[numbersLen/2];
}
C++
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
sort(numbers.begin(), numbers.end());
int target = numbers[numbers.size() / 2];
int count = 0;
for (int i = 0; i < numbers.size(); i++)
if (target == numbers[i])
count++;
if(count > numbers.size() / 2)
return target;
return 0;
}
};
思路三:
两种方法, 第一种:用数组记录这个多的值,(栈的思想) 遇见相同的,同时进栈,遇见不同的出栈 第二种:用一个值记录里面多的元素的个数 遇见相同的数字++ 遇见不同的记录–
下面用的是第二种: C
int MoreThanHalfNum_Solution(int* numbers, int numbersLen )
{
int sz = 0;
int ret;
for(int i = 0;i<numbersLen;i++)
{
if(sz == 0){
ret = numbers[i];
sz++;
}
else{
if(ret == numbers[i]) sz++;
else sz--;
}
}
return ret;
}
C++
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers)
{
int sz = 0;
int ret;
for (int i = 0; i < numbers.size(); i++)
{
if (sz == 0) {
ret = numbers[i];
sz++;
}
else {
if (ret == numbers[i]) sz++;
else sz--;
}
}
return ret;
}
};
|