Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱
MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina.com

算法 数组中出现次数最多的数字


目录

数组中出现次数最多的数字

给定一个int数组,找出出现次数最多的数字(出现次数超过数组长度的一半)

方式一:快速排序

先对这个数组进行排序,在已排序的数组中,位于中间位置的数字就是超过数组长度一半的那个数。

public class Test {

    public static void main(String[] args) throws Exception {
int[] array = { 1, 1, 1, 1, 5, 1, 5, 1, 5, 5, 5 };
qsort(array);
System.out.println(Arrays.toString(array));
} public static void qsort(int[] arr) {
qsort(arr, 0, arr.length - 1);
} public static void qsort(int[] arr, int low, int high) {
if (low < high) {
int pivot = partition(arr, low, high);//将表一分为二
qsort(arr, low, pivot);//对低子表【递归】排序
qsort(arr, pivot + 1, high);//递归对高子表递归排序
}
} private static int partition(int[] arr, int low, int high) {
int pivotkey = arr[low];//选择一个【基准元素】,通常选择第一个元素或者最后一个元素
while (low < high) {//从表的两端【交替】地向中间扫描
//将比基准元素小的交换到低端
while (low < high && arr[high] >= pivotkey) {
high--;
}
swap(arr, low, high);
//将比基准元素大的交换到高端
while (low < high && arr[low] <= pivotkey) {
low++;
}
swap(arr, low, high);
}
return low;//此时基准元素在其排好序后的正确位置
} public static void swap(int[] arr, int i, int j) {
if (i == j) return;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}

时间复杂度为 O(n*lgN)

空间复杂度为 O(n*lgN)

方式二:两次循环

第一次循环是为了记录各个数字出现的次数

第二次循环是为了比较各个数字出现的次数

这种方式没有利用出现次数超过数组长度的一半这个特殊条件,可以在任何数组中找出出现次数最多的数字。

public class Test {

    public static void main(String[] args) throws Exception {
int[] array = { 1, 1, 1, 1, 5, 1, 5, 1, 5, 5, 5 };
System.out.println(mostNum(array));
} public static int mostNum(int[] array) {
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < array.length; i++) {
int key = array[i];
if (map.containsKey(key)) {
map.replace(key, map.get(key) + 1);
} else {
map.put(key, 1);
}
} int key = array[0];
for (Entry<Integer, Integer> entry : map.entrySet()) {
if (entry.getValue() > map.get(key)) {
key = entry.getKey();
}
}
return key;
}
}

时间复杂度为O(n)

空间复杂度为O(n)

方式三:一次循环

取巧的做法,仅当出现次数超过数组长度的一半这种条件下才保证正确。

public class Test {

    public static void main(String[] args) throws Exception {
int[] array = { 1, 1, 1, 1, 5, 1, 5, 1, 5, 5, 5 };
System.out.println(mostNum(array));
} public static int mostNum(int[] array) {
int count = 1, value = array[0]; for (int i = 1; i < array.length; i++) {
if (array[i] == value) {
count++; //如果下一个数字与之前保存的数字相同,则次数加1
} else {
count--; //如果不同,则次数减1
}
if (count == 0) {
value = array[i]; //如果次数为0,则需要保存下一个数字,并把次数设定为1
count = 1;
}
}
return value;
}
}

时间复杂度为O(n)

空间复杂度为O(1)

2018-12-8

算法 数组中出现次数最多的数字 MD的更多相关文章

  1. 编程算法 - 数组中出现次数超过一半的数字 代码(C)

    数组中出现次数超过一半的数字 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 数组中有一个数字出现的次数超过数组长度的一半, 请找出这个数字. ...

  2. [PHP] 算法-数组中出现次数超过一半的数字的PHP实现

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

  3. 给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)

    """ #给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 #返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况) 解题思路: 1.设定一个 ...

  4. 九度OJ 1370 数组中出现次数超过一半的数字

    题目地址:http://ac.jobdu.com/problem.php?pid=1370 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2 ...

  5. 数组中出现次数超过一半的数字 -java

    数组中出现次数超过一半的数字 -java 方法一: 数组排序,然后中间值肯定是要查找的值. 排序最小的时间复杂度(快速排序)O(NlogN),加上遍历. 方法二: 使用散列表的方式,也就是统计每个数组 ...

  6. Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)

    剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...

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

    剑指Offer:数组中出现次数超过一半的数字[39] 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于这 ...

  8. php实现求数组中出现次数超过一半的数字(isset($arr[$val]))(取不同数看剩)(排序取中)

    php实现求数组中出现次数超过一半的数字(isset($arr[$val]))(取不同数看剩)(排序取中) 一.总结 1.if(isset($arr[$val])) $arr[$val]++; //1 ...

  9. 剑指Offer(二十八):数组中出现次数超过一半的数字

    剑指Offer(二十八):数组中出现次数超过一半的数字 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...

随机推荐

  1. BZOJ.3698.XWW的难题(有源汇上下界最大流ISAP)

    题目链接 按套路行列作为两部分,连边 \(S->row->column->T\). S向代表行的元素连边cap(A[i][n])(容量上下界为上下取整),代表列的元素向T连边cap( ...

  2. hdu 5726 GCD 暴力倍增rmq

    GCD/center> 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Give you a sequence ...

  3. python使用递归实现一个分形图形

    代码如下: import turtle def main(): t = turtle.Turtle() t.hideturtle() t.speed(10) level = 12 fract(t,-8 ...

  4. ubuntu下msmtp+mutt的安装和配置

    1.mutt+msmtp的安装 默认情况下smokeping发送邮件使用sendmail,但是sendmail配置起来真心不是一般的麻烦,而且也没有必要,完全大材小用了,所以我就想用mutt+msmt ...

  5. TWebSocketClient

    TWebSocketClient 支持WEBSOCKET通讯协议的客户端控件. 连接WEBSOCKET SERVER的代码演示: WebSocketClient1.HostName := '88.19 ...

  6. 添加类似navigationController自带的返回按钮

    添加类似navigationController自带的返回按钮,效果如下: 一.UINavigationcontroller自带的navigationBar 是无法添加左箭头的返回按钮的 在网上搜索了 ...

  7. C#编程(七十四)----------释放非托管资源

    释放非托管资源 在介绍释放非托管资源的时候,我觉得有必要先来认识一下啥叫非托管资源,既然有非托管资源,肯定有托管资源. 托管资源指的是.net可以自棕进行回收的资源,主要是指托管堆上分配的内存资源.托 ...

  8. C#编程(三十四)----------数组作为参数

    原文链接: http://blog.csdn.net/shanyongxu/article/details/46765267 数组作为参数 数组可以作为参数传递给方法,也可以从方法中返回.要返回一个数 ...

  9. 无线通信中FEC 编码原理及评价

    转自:http://blog.csdn.net/wiznet2012/article/details/7492146 大家好,前面我们给大家介绍了无线通信中FEC编码原理(1)和(2),今天继续献上F ...

  10. mysql递归查询子类ID查询所有子类

    先来看数据表的结构如下: id  name    parent_id  ---------------------------  1   Home        0  2   About        ...