数组中出现次数超过一半的数字

两种思路:
思路一:由于出现次数超过一半,所以如果对这个数组进行划分之后无论如何,位于数组下标 n/2的数字就是出现次数超过一半的数
所以问题就转换为了求划分一次之后 位于 n/2的数字 – Partion()方法不一定能恰好就找到 n/2的位置,所以需要多次迭代
因此该方法严格来说并不是一种 O(N)复杂度的,而是 O(KN)
其中 K大于等于1小于等于logN
思路二:严格意义上的O(N)时间复杂度的算法
利用一次遍历,记录当前数字和出现次数,如果遇到的下一个数字和当前数字相同而且当前记录的次数大于等于1,那么就将次数加1
否则更新记录数字为当前数字,记录次数为1。循环直到数组遍历完毕,那么所记录的数字就是出现次数大于一半的数字

注意:由于可能存在给定的数组中并没有满足要求的数字,因此还需要对最后的结果进行检验–for循环即可,所以最终时间复杂度还是O(N)

public class _Q29<T> {// 采用遍历的方法实现查找出现次数超过一半的数public int MoreThanHalf(int nums[]){if(nums == null) return Integer.MIN_VALUE;int result = nums[0];int count = 1;for(int i=1; i<nums.length; i++){if(nums[i] == result){count++;}else{if(count > 0){--count;}else{result = nums[i];count = 1;}}}count = 0;for(int i=0; i< nums.length; i++){if(nums[i] == result) { count++;}}if(count > (nums.length>>1)){return result;}else{return Integer.MIN_VALUE; }}public int MoreThanHalf_v2(int nums[]){if(nums == null) return Integer.MIN_VALUE;int middle = nums.length>>1;int index = Partition(nums, 0, nums.length - 1);while(index != middle){if(index > middle){index = Partition(nums, 0, index - 1);}else{index = Partition(nums, index + 1, nums.length - 1);}}int result = nums[index];int count = 0;for(int i=0; i< nums.length; i++){if(nums[i] == result) { count++;}}if(count > (nums.length>>1)){return result;}else{return Integer.MIN_VALUE; }}/*** * @comment 快排的划分函数* @param nums* @param start 区间下界,也是可以取到* @param end  区间上界,可以取到。初始时一般是XXX.length - 1* @return int  * @throws* @date 2016年4月16日 下午5:23:18*/public int Partition(int nums[], int start, int end){if(nums == null || start > end) return Integer.MIN_VALUE; // 此处应该抛出异常int index = CommonUtils.RandomInRange(start, end);CommonUtils.SwapInArray(nums, index, end);int smallIndex = start - 1; // 用于记录枢纽值最终位置for(index=start; index<end; index++){if(nums[index] < nums[end]){ smallIndex++;if(smallIndex != index){ // 只是为了避免不必要的交换CommonUtils.SwapInArray(nums, index, smallIndex);}}}smallIndex++;CommonUtils.SwapInArray(nums, smallIndex, end);return smallIndex; // smallIndex就是将当前的数组划分为两个部分的}}

测试代码:

public class _Q29Test extends TestCase {_Q29 moreThanHalf = new _Q29();public void test(){int nums[] = {1, 2, 3, 2, 2, 2, 5, 4, 2};int result = moreThanHalf.MoreThanHalf(nums);System.out.println(result);result = moreThanHalf.MoreThanHalf_v2(nums);System.out.println(result);}}

【剑指offer-Java版】29数组中出现次数超过一半的数字相关推荐

  1. 剑指offer面试题[29]-数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  2. 【剑指Offer】28、数组中出现次数超过一半的数字

      题目描述:   数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.   例如:输入如下所示的一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过 ...

  3. 剑指offer面试题39. 数组中出现次数超过一半的数字(数组)(摩尔投票法)

    题目描述 **数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素.** 思路 详见链接 代码 class Solution:def ...

  4. 剑指offer没有java版吗_剑指Offer(Java版) 持续更新中

    面试题2 单例(之前有整理,略) 面试题3 二维数组中的查找 public boolean find(int target, int [][] array) { boolean found = fal ...

  5. 剑指offer——面试题29:数组中出现次数超过一半的数字

    剑指offer--面试题29:数组中出现次数超过一半的数字 Solution1: 20180902日整理 注意几点: 1.若下一个数字和我们之前保存的数字相同,则次数 +1 2.若下一个数字和我们之前 ...

  6. 剑指offer java版 test3—从尾到头打印链表

    标题:剑指offer java版 test3-从尾到头打印链表 题目:输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 解答:知识不够全面,用ArrayList做的 但是看到大佬们还可以 ...

  7. 剑指offer:二维数组中的查找

    目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺 ...

  8. 【LeetCode】剑指 Offer 04. 二维数组中的查找

    [LeetCode]剑指 Offer 04. 二维数组中的查找 文章目录 [LeetCode]剑指 Offer 04. 二维数组中的查找 package offer;public class Solu ...

  9. 【LeetCode】剑指 Offer 39. 数组中出现次数超过一半的数字

    [LeetCode]剑指 Offer 39. 数组中出现次数超过一半的数字 文章目录 [LeetCode]剑指 Offer 39. 数组中出现次数超过一半的数字 一.摩尔投票法 一.摩尔投票法 核心理 ...

最新文章

  1. android6.0麦克风权限,android 6.0权限检测以及6.0以下,麦克风、相机权限判断
  2. ios开发中计算代码运算时间_iOS日历、日期、时间的计算
  3. hdu2962 二分 + spfa
  4. 大专普通本科、搞算法的(蓝桥杯、ACM、天梯赛)-后续成长之路
  5. [FFmpeg] ffmpeg 常用命令
  6. 正则表达式实战---爬取多张图片
  7. 喇叭正反相位测试音频_FIR滤波器能给音频扩声带来怎样的帮助?
  8. Kafka Metrics指标监控
  9. jvm虚拟机创建对象
  10. html mui按钮居中,《mui学习笔记》:自定义选项卡
  11. 小学教育专业有计算机课程吗,小学计算机课程教学工作总结
  12. python的egg包的安装和制作]
  13. 各种Windows版本下载
  14. 仓库管理系统数据库设计
  15. 技术总监岗位职责和要求
  16. 【Word】Word运行时提示“Word在试图打开文件时遇到错误”的解决办法
  17. 大数据学习资源最全版本(收藏)
  18. dst发育筛查有意义吗_Dst发育筛查是什么?
  19. VC5509的通用GEL代码
  20. Wine运行微信和QQ进行完善,直接打开接收到的文件

热门文章

  1. python画笔初始位置_turtle绘画-移动落笔点(改变初始原点)
  2. c语言复杂性,C语言复杂函数
  3. qstringlist格式怎么写到txt_进阶能力 | 一招解决TXT电子书乱码问题
  4. Linux 中文件管理常用的工具
  5. 换行显示print_r($arr);打印结果显示:Array( [0] = 百度 [1] = 阿里)
  6. win7清除系统托盘图标的方法
  7. [CALayer release]: message sent to deallocated instance
  8. Socket经验记录
  9. 第三章 “我要点爆”微信小程序云开发之点爆方式页面和爆炸之音页面制作
  10. 存储过程 psal emp.sal%type是什么意思