题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

思路一
遍历数组是保存两个值:一个是数字中的一个数字,另一个是次数。当遍历到下一个数字的时候,如果下一个数字和之前保存的数字相等,则次数加1;如果不同,则次数减1;如果次数为零,那么我们需要保存下一个数字,并把次数设置为1。
由于我们要找的数字出现的次数比其他所有数字出现的次数之和还要多,那么要找的数字肯定是最后一次把次数设置为1时对应的数字。

class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> nums) {
if(nums.size() <= 0){
return 0;
}
int res = nums[0];
int times = 1;
for(int i = 1; i < nums.size(); ++i){
if(times == 0){
res = nums[i];
times = 1;
}
else if(nums[i] == res){
times++;
}
else{
times--;
}
}
if(!CheckMoreHalf(nums, res)){
res = 0;
}
return res;
}
private:
//判断这个数字是否出现次数超过一半
bool CheckMoreHalf(vector<int>& nums, int result){
int times = 0;
for(int i = 0; i < nums.size(); ++i){
if(nums[i] == result){
++times;
}
}
if(times * 2 <= nums.size()){
return false;
}
return true;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
思路二
基于快排的思想。将数组排序后,中间的数字即为要寻找的数字,那么,这个数据就是统计学上的中位数,即长度为n的数组中第n/2大的数字。
在随机快排中,随机选择一个数字,调整数组顺序,如果其下标刚好是n/2,那么就找到了中位数;如果其下标小于n/2,则中位数应该在它的右边;如果其下标大于n/2,则中位数应该在它的左边。

class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> nums) {
int n = nums.size();
if(n <= 0){
return 0;
}
int left = 0, right = n - 1;
int mid = n / 2;
int index = Partition(nums, left, right);
while(index != mid){
if(index > mid){
right = index - 1;
index = Partition(nums, left, right);
}
else{
left = index + 1;
index = Partition(nums, left, right);
}
}
int res = nums[mid];
if(!CheckMoreHalf(nums, res)){
res = 0;
}
return res;
}
private:
int Partition(vector<int>& nums, int left, int right){
int pivot = nums[right];
int tail = left - 1;
for(int i = left; i < right; ++i){
if(nums[left] <= pivot){
++tail;
if(tail != i)
swap(nums[tail], nums[i]);
}
}
swap(nums[tail+1], nums[right]);
return tail+1;
}
bool CheckMoreHalf(vector<int>& nums, int result){
int times = 0;
for(int i = 0; i < nums.size(); ++i){
if(nums[i] == result){
++times;
}
}
if(times * 2 <= nums.size()){
return false;
}
return true;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

---------------------

剑指offer——数组中出现次数超过一半的数字(c++)的更多相关文章

  1. python剑指offer数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  2. 剑指Offer——数组中出现次数超过一半的数字——一题多解

    看题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  3. 剑指Offer——数组中出现次数超过一半的数字

    题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2 ...

  4. 用js刷剑指offer(数组中出现次数超过一半的数字)

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  5. 剑指Offer-28.数组中出现次数超过一半的数字(C++/Java)

    题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如 ...

  6. 剑指offer--11.数组中出现次数超过一半的数字

    unique(), count()函数好用 ---------------------------------------------------------------------- 时间限制:1秒 ...

  7. 1-剑指offer: 数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  8. 剑指offer-数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  9. Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)

    剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...

随机推荐

  1. Linux系统之-介绍,主要特性

    Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件.应用程序和网络协议.它支持32位 ...

  2. [CSP-S模拟测试]:蛋糕(区间DP)

    题目传送门(内部题34) 输入格式 第一行,一个正整数$n$.第二行,$n$个正整数$a_i$,保证$a_i$互不相等. 输出格式 一行一个整数表示间宫卓司得到的蛋糕大小总和的最大值. 样例 样例输入 ...

  3. SQL Server中char、varchar、text和nchar、nvarchar、ntext的区别 (转)

    转:http://blog.csdn.net/jackychu/article/details/4183118 http://www.cnblogs.com/jhxk/articles/1633578 ...

  4. Javascript 数组 数字 字符串 时间等使用

    1.Javascript 数组API 1. //定义数组 2. var pageIds = new Array(); 3. pageIds.push('A'); 5. 数组长度 6. pageIds. ...

  5. Java关于Math类的三个取整方法

    0x01 在java的Math类中有三个关于浮点数取整数的方法,分别是ceil (向上取整) floor(向下取整) round(四舍五入) 三个方法 0x02 ceil 向上取整,取整后总是比原来的 ...

  6. 5. 使用grafana模板

    我们刚刚配置的Dashboard还是有点简陋,为了界面美观,这里我们这里使用一些模板 1.使用node_exporter模板 去grafana官网下载模板,点击Download,如下所示 2.导入模板 ...

  7. Centos7下实现docker + wordpress 安装

    一.Docker CE 安装 检查是否安装过旧的版本 如果系统安装旧版本Docker需要先卸载,命令如下: [root@localhost Wordpresss]sudo yum remove doc ...

  8. UVA1632_Alibaba

    题目链接 大致题意:直线上面有n个点,第i个点坐标为xi,它会在di时间消失,你可以选择从任何位置出发,求访问完所有点的最短时间,无解输出no solution 思路:这有一个难点就是,不知道状态该怎 ...

  9. apache虚拟主机配置及解析

    Apache虚拟主机配置及解析 1.修改httpd-vhosts.conf 打开apache(Apache24)/conf/extra/httpd-vhosts.conf文件,添加虚拟主机信息,可以这 ...

  10. 【小程序】获取到的e.target与e.currentTarget区别

    [小程序]获取到的e.target与e.currentTarget区别:https://blog.csdn.net/qq_33744228/article/details/80310294 使用e.t ...