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

来源:互联网 发布:纪子妃 知乎 编辑:程序博客网 时间:2024/06/08 18:40

题目描述

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

解析:

找到数组中的最大的数number,定义一个整型数组长度为s[number+1],初始化为0。扫描给定的数组numbers[0:length-1],s[numbers[i]]++,(s[j]记录的是数j在数组numbers中出现的次数),这样数组numbers中每个数出现的次数都被数组s记录下来,若s[r]>numbers.size()/2,则数r就是要找的出现次数超过一半的数。

代码1:

class Solution {public:    int MoreThanHalfNum_Solution(vector<int> numbers) {        if(numbers.size()==0)//空数组            return 0;        int length=numbers.size();        int count=0;        int max=numbers[0];        for(int i=1;i<length;i++){            if(max<numbers[i])                max=numbers[i];        }        int s[max+1];        for(int r=0;r<max+1;r++)            s[r]=0;        for(int i=0;i<length;i++){            s[numbers[i]]++;        }        int j=0;        for(;j<max+1;j++){            if(s[j]>length/2){                return j;            }        }        return 0;    }};

代码2:

class Solution {public:    int MoreThanHalfNum_Solution(vector<int> numbers) {        int length = numbers.size();        if (length == 0)            return 0;        sort(numbers.begin(), numbers.end());//排序        int max_num = 0;        int num = 0;        int val = numbers[0];        for (int i = 0; i < length; i++) {            if (val == numbers[i]) {                num++;//记录val连续出现次数            }            else {                max_num = num > max_num ? num : max_num;//当前出现最多的次数                if (max_num > length / 2)                    return val;//出现次数超过一半,找到                val = numbers[i];//还没找到出现次数超过一半的数                num = 1;            }        }        max_num = num > max_num ? num : max_num;//前面没找到,最后几个数相等的情况        if (max_num > length / 2)            return val;        else            return 0;    }};



阅读全文
0 0
原创粉丝点击