剑指offer-面试题39-数组中出现次数超过一半的数字-快速排序

/*
题目:
	数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
	例如输入一个长度为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;

}

   

猜你喜欢

转载自www.cnblogs.com/buaaZhhx/p/11979119.html