剑指offer-面试题39-数组中出现次数超过一半的数字-抵消法
2024-09-06 18:55:57
/*
题目:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
*/
/*
思路:
数组中出现次数超过数组长度的一半的值为target,
则从头到尾遍历数组,遇到不同的值-1,遇到相同的值次数+1,
最终剩下的数字就可能是target,
验证其出现次数是否超过数组长度的一半。
*/
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<set>
#include<vector> using namespace std; bool isTarget(vector<int> &numbers,int targetValue){
int times = 0;
for(int i = 0; i < numbers.size(); i++){
if(numbers[i] == targetValue){
times++;
}
}
if(times*2 > numbers.size()){
return true;
}else{
return false;
}
} int MoreThanHalfNum_Solution(vector<int> numbers) {
if(numbers.size() == 0) return 0;
int target = numbers[0];
int myCount = 1;
for(int i = 1; i < numbers.size(); i++){
if(myCount == 0){
target = numbers[i];
myCount = 1;
}else if(target == numbers[i]){
myCount++;
}else{
myCount--; }
}
if(isTarget(numbers,target)){
return target;
}else{
return 0;
} } int main(){
vector<int> a = {4,2,1,4,4,4};
cout<<MoreThanHalfNum_Solution(a)<<endl; }
最新文章
- CSS3学习总结
- 使用Vmware虚拟机部署开发环境之Mac OS X系统安装
- bzoj2083【Poi2010】Intelligence test
- tensorflow 学习笔记
- mssql注入
- 使用jQuery Mobile和Phone Gap开发Android应用程序
- 4月数据库流行度排行榜 MySQL能否追上Oracle
- debug.keystore文件不存在解决办法
- 谈论高并发(三十)解析java.util.concurrent各种组件(十二) 认识CyclicBarrier栅栏
- Visual Studio2017数据库架构比较
- 我把一些Linux的中英文命令做了对应翻译大家参考一下
- hdu1255扫描线计算覆盖两次面积
- [No000018B]写代码要用 Vim,因为越难入门的工具回报越大
- 56.纯 CSS 描述程序员的生活
- Charles抓包实战详解
- C++课堂作业_02_PAT1025.反转链表
- Ubuntu14.04 安装git
- iOS autoLayout总结
- UVa 11636 你好 世界!(贪心)
- android -chrome 调试