【剑指offer】数组中次数超过一半的数
来源:互联网 发布:淘宝代运营tmyunying 编辑:程序博客网 时间:2024/06/05 08:13
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路
第一个思路是,这个数字出现次数超过数组的一半,那么它一定出现在数组中间,即中位数。因此,我们可以选择数组中任意一个数,对它进行切分(即快速排序中的切分算法,切分后此切分元素左边的数均不大于切分元素,切分元素右边的元素均不小于切分元素)。若切分后此切分元素的下标为n/2,即为中位数,若大于n/2,则在它左边继续上述步骤,反之在右边进行上述步骤。
第二个思路是根据数组特点,这个数字出现的次数比其他数字出现次数的和还多。因此,我们可以保存两个值,一个是数组中的一个数字,另一个是次数,当我们遍历到下一个数字时,当下一个数字与当前保存的值相同,那么我们把次数加1.若不同,则减1,若次数为0,则把当前保存数字改为下一个数字,并把次数设为1.很明显,我们所找的数字就是最后一个把次数设为1的数字,即保存的值。
代码
public class Solution { public int MoreThanHalfNum_Solution(int [] array) { if (array == null || array.length <= 0) return 0; int result = array[0]; int times = 1; for (int i = 0; i <array.length; i++){ if (times == 0){ result = array[i]; times = 1; } else if (array[i] == result) times++; else times--; } times = 0; for (int i = 0; i < array.length; i++){ if (result == array[i]) times++; } if (times*2 <= array.length) return 0; else return result; }}
阅读全文
0 0
- 剑指offer--数组中出现次数超过一半的数
- 剑指offer 数组中出现次数超过一半的数
- 【剑指offer】数组中次数超过一半的数
- 剑指offer--数组中出现次数超过一半的数字
- 剑指offer之数组中次数超过一半的数字
- 《剑指offer》数组中出现次数超过一半的数字
- 剑指offer:数组中出现次数超过一半的数字
- 【剑指Offer】数组中出现次数超过一半的数字
- 剑指offer:数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字||剑指offer
- 剑指offer 数组中出现次数超过一半的数字
- 剑指offer:数组中出现次数超过一半的数字
- [剑指offer]数组中出现次数超过一半的数字
- 《剑指offer》-数组中出现次数超过一半的数字
- 剑指offer|数组中出现次数超过一半的数字
- 剑指offer-数组中出现次数超过一半的数字
- 《剑指offer》数组中出现次数超过一半的数字
- 剑指offer - 数组中出现次数超过一半的数字
- JVM必知必会(六)【jvm常用工具-visualvm】
- CentOS6下源码编译的php7安装redis扩展
- 算法练习(25):Maximum Length of Repeated Subarray
- jquery:将table表变为可编辑状态,记录修改,新增或者删除的行。传入后台controller中
- Hive_基础
- 【剑指offer】数组中次数超过一半的数
- 牛顿法
- 数据结构--循环列队
- linux vi/vim
- 京东金融x银联晒“打黑成绩单”:一年内避免用户损失上亿元,未来共筑AI风控
- js取整、取余的方法
- 数据结构实验: 树形结构及其应用(C语言)
- node.js中的fs模块
- jeesite的junit,数据没有插入?