前言
- 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。
- 个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 题目来自:牛客/题库 / 在线编程 / 剑指offer:
问题描述:
-
给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。 -
数据范围:n≤50000,数组中元素的值 0≤val≤10000
要求:空间复杂度:O(1),时间复杂度 O(n)
---
# 举例:
```c
//示例1:
//输入:
[1,2,3,2,2,2,5,4,2]
//返回值:
2
//=======================
//示例2:
//输入:
[3,3,3,3,2,2,2]
//返回值:
3
//=======================
//示例3:
//输入:
[1]
//返回值:
解法思路:
循环搜索
代码结果:
//这是2013年408真题中的求主元素。
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
int main = numbers[0]; //先设主元素为数组第一个元素
int cnt = 1; //而且计数为1
int i = 0;
for(i = 1; i < numbers.size(); i++)
{
if(numbers[i] == main) //依次访问,如果与当前主元素相同
cnt++; //则计数加1
else{
if(cnt > 0) //如果不是该主元素,且计数仍旧大于0
cnt--; //则计数减1
else{ //如果不是主元素,且计数小于等于0
main = numbers[i]; //就切换主元素,设当前访问元素为主元素
cnt = 1; //重新计数为1,开始下一趟循环
}
}
}
if(cnt > 0) //全部访问完后再验证最后剩下的元素是否真为主元素
for( i =0, cnt =0; i < numbers.size(); i++)
if(numbers[i] == main)
cnt++; //统计该元素出现次数
if(cnt > numbers.size() / 2) //次数超过一半则为主元素
return main;
else
return 0; //若该数出现次数不大于一半,则数组中不存在主元素
}
};
结束语
- 以上就是该C语言编程题的内容。可以在牛客尝试刷几道题目来练习实践。牛客网刷题(点击可以跳转),可以尝试注册使用。
- 题目来自:牛客/题库 / 在线编程 / 剑指offer: