/* 题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 */ /* 思路: 转化为快排中,第n/2大的数字。 验证该数字是否超过总长度的一半。 */ #include<iostream> #include<string.h> #include<stdio.h> #include<set> #include<vector> using namespace std; int core(vector<int> &numbers, int beginIndex,int endIndex,int target){ int k = endIndex; int val = numbers[endIndex]; for(int i = endIndex-1; i >= beginIndex; i--){ if(numbers[i] > val){ swap(numbers[i],numbers[k]); k--; } } if(k == target){ return numbers[k]; }else if(k > target){ return core(numbers,beginIndex,k-1,target); }else{ return core(numbers,k+1,endIndex,target); } } 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.empty()) return 0; int target = numbers.size()/2; int targetValue = core(numbers,0,numbers.size()-1,target); cout<<targetValue<<endl; if(isTarget(numbers,targetValue)){ return targetValue; }else{ return 0; } } int main(){ vector<int> a = {4,2,1,4,2,4}; cout<<MoreThanHalfNum_Solution(a)<<endl; }