分治法-数组中出现次数超过一半的数字

来源:互联网 发布:windows版本号查询 编辑:程序博客网 时间:2024/05/16 18:00

题目描述

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

算法1:
排序后,如果存在解,那么在最中间的数字是出现次数超过一半的数字。

算法2:
不排序,使用partition,每次都如快速排序一样,判断每一个数字是不是在partition后处于中间位置与否,如果处于则为所求。最后要判断数字有没有超过一半次数

class Solution {public:    //分区,找到每次的第一个数字排序后的最终位置    int Partition(vector<int> &numbers,int start,int end){        int key = numbers[start];        int i = start;        int j = end;        while (i < j){            while (i < j && numbers[j] > key){                j--;            }            if(i < j)                numbers[i++] = numbers[j];            while (i<j && numbers[i] < key)                i++;            if(i < j)                numbers[j--] = numbers[i];        }        numbers[i] = key;        return i;    }    //检查在中间位置的数出现次数是否超过一半    bool ChechHalf(int number,vector<int>numbers){        int count = 0;        int half =(int)numbers.size() / 2;        for (int i = 0; i < numbers.size(); ++i) {            if(numbers[i] == number)                count++;        }        return count > half;    }    int MoreThanHalfNum_Solution(vector<int> numbers) {        if(numbers.size() == 0)            return 0;        //出现次数大于数组一半,该数字肯定是排好序的中间位置.        int start = 0;        int end = (int)numbers.size() - 1;        int middle = (start + end + 1) / 2;        int index = Partition(numbers,start,end);        while (index != middle){            //数字在后半部分,则往前找            if(index > middle){                end = index - 1;                index = Partition(numbers,start,end);            }                //数字在前半部分,则往后找            else{                start = index + 1;                index = Partition(numbers,start,end);            }        }        if(index == middle && ChechHalf(numbers[index],numbers))            return numbers[index];        else            return 0;    }};
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 开水龙头水管响怎么办? 海里游泳遇到暗流怎么办 网站运营权出问题怎么办 在澳门超期出关怎么办 妹妹初中毕业谈恋爱怎么办 原告的证据造假怎么办 慕课考试不及格怎么办 大学高数不及格怎么办 对方拒绝司法调解怎么办? cas授权已过期怎么办 英法巡航南海中国怎么办 wps文件不能改怎么办 wps不能删除内容怎么办 word文件被锁定怎么办 word批注不显示怎么办 wps怎么办把修订取消 审阅密码忘了怎么办 psv关机后怎么办刷 被螃蟹扎了怎么办 被海鲜划伤出血怎么办 海域使用证缴纳金没交怎么办 海峡中线 金门海域怎么办 对工作失去热情怎么办 取款机多出钱怎么办 风扇声音很响怎么办 稳压器输出没电怎么办 稳压器不稳10压怎么办 dnf凯蒂不见了怎么办 马桶里掉进塑料瓶盖怎么办 塑料瓶子盖子打不开怎么办 按压瓶盖坏了怎么办 瓶盖拧错位了怎么办 红酒盖子开不了怎么办 胶盖罐头打不开怎么办 玻璃瓶的塑料盖打不开怎么办 香水按压不出来怎么办 电高压锅盖子打不开怎么办 杯子螺口错位怎么办 散粉盖子扭不开怎么办 玻璃瓶饮料盖子打不开怎么办 玻璃瓶玻璃盖子打不开怎么办