数组中出现次数超过一半的数字
- 1.题目
- 2.思路
- 3.代码
1.题目
链接: 数组中出现次数超过一半的数字
2.思路
【解题思路1】:
思路一:数组排序后,如果符合条件的数存在,则一定是数组中间那个数。这种方法虽然容易理解,但由于
涉及到快排sort,其时间复杂度为O(NlogN)并非最优;
【解题思路2】:
众数:就是出现次数超过数组长度一半的那个数字
如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,
最后留下的数肯定是众数
3.代码
#include <algorithm>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型vector
* @return int整型
*/
int MoreThanHalfNum_Solution(vector<int>& numbers) {
// write code here
//解法1
/* int size=numbers.size();
sort( numbers.begin(), numbers.end());
if(size>1)
return numbers[size/2];
else
return numbers[0];*/
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) {
if (numbers[i] == result) {
++times;
} else {
--times;
}
} else {
result = numbers[i];
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;
}
};