分治法-数组中出现次数超过一半的数字
来源:互联网 发布: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
- 分治法-数组中出现次数超过一半的数字
- 数组中超过出现次数超过一半的数字
- 74.数组中超过出现次数超过一半的数字
- 74 数组中超过出现次数超过一半的数字
- 剑指offer——数组中出现次数超过一半的数字_(待写最优法分治)
- 【数组4】数组中出现次数超过一半的数字
- 数组4:数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字
- 找出数组中出现次数超过长度一半的数字
- 2-数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字[算法]
- 数组中出现次数超过一半的数字
- 找出数组中出现次数超过一半的数字--百度
- 数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字
- 寻找数组中出现次数超过一半的数字
- ManyToMany(基于注解)使用之进阶(中级版)
- iOS学习(二十五)Objective-C 动态创建
- 小白笔记--------------jsp超链接传值
- VMware与VirtualBox相互转换
- 【MyBatis框架】mybatis和spring整合
- 分治法-数组中出现次数超过一半的数字
- Android 四大组件之BroadcastReceiver 广播
- ios-Cell 的层级关系
- redis 配置开机启动
- VMware下虚拟机ubuntu的联网配置
- Serializable的序列化与反序列化
- Eclipse Neon Java EE IDE 安装配置指南
- python学习——map/reduce
- C#写的工厂抽象模式