算法 数组中出现次数最多的数字 MD
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的更多相关文章
- 编程算法 - 数组中出现次数超过一半的数字 代码(C)
数组中出现次数超过一半的数字 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 数组中有一个数字出现的次数超过数组长度的一半, 请找出这个数字. ...
- [PHP] 算法-数组中出现次数超过一半的数字的PHP实现
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在 ...
- 给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)
""" #给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 #返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况) 解题思路: 1.设定一个 ...
- 九度OJ 1370 数组中出现次数超过一半的数字
题目地址:http://ac.jobdu.com/problem.php?pid=1370 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2 ...
- 数组中出现次数超过一半的数字 -java
数组中出现次数超过一半的数字 -java 方法一: 数组排序,然后中间值肯定是要查找的值. 排序最小的时间复杂度(快速排序)O(NlogN),加上遍历. 方法二: 使用散列表的方式,也就是统计每个数组 ...
- Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)
剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...
- 剑指Offer:数组中出现次数超过一半的数字【39】
剑指Offer:数组中出现次数超过一半的数字[39] 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于这 ...
- php实现求数组中出现次数超过一半的数字(isset($arr[$val]))(取不同数看剩)(排序取中)
php实现求数组中出现次数超过一半的数字(isset($arr[$val]))(取不同数看剩)(排序取中) 一.总结 1.if(isset($arr[$val])) $arr[$val]++; //1 ...
- 剑指Offer(二十八):数组中出现次数超过一半的数字
剑指Offer(二十八):数组中出现次数超过一半的数字 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...
随机推荐
- DPDK+OpenvSwitch-centos7.4安装
系统版本 [root@controller ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) DPDK版本: dpdk- ...
- 每日踩坑 2018-11-26 MVC Razor ActionLink 生成的URL中多生成了一个参数 ?length=n
RouteConfig 的路由注册如下: routes.MapRoute( name: "Default", url: "{controller}/{action}&qu ...
- HTTP错误405
405 - 用来访问本页面的(方法不被允许) HTTP 错误 405 -禁止访问资源 HTTP 错误 405 405 不允许此方法 对于请求所标识的资源,不允许使用请求行中所指定的方法.请确保为所请求 ...
- codevs 1077 多源最短路
题目描述 Description 已知n个点(n<=100),给你n*n的方阵,a[i,j]表示从第i个点到第j个点的直接距离. 现在有Q个询问,每个询问两个正整数,a和b,让你求a到b之间的最 ...
- BZOJ2465: [中山市选2009]小球
Description 给定n个不同颜色的球,每个球都有一个分数,同时有m个瓶子,每个瓶子都有固定的容量.现在,你必须把球放到瓶子里面.请编程计算最多能放多少个球到这些瓶子里. Inpu ...
- hdu 5194 组合数学or暴力
直接凑了个公式带入,没想到直接ac了,至于题解中的期望可加性可以参考概率论相关知识 #include<cstdio> #include<iostream> #include&l ...
- Android之Android WebView常见问题及解决方案汇总
如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456 Android WebView常见问题解决方案汇总: 就目前而言,如何应对版本的频繁更新呢,又如何灵活多变 ...
- 吴恩达-coursera-机器学习-week9
十五.异常检测(Anomaly Detection) 15.1 问题的动机 15.2 高斯分布 15.3 算法 15.4 开发和评价一个异常检测系统 15.5 异常检测与监督学习对比 15.6 选择特 ...
- .net core程序部署
前期将一些程序切换到了.net core,本文这里记录下windows 下.net core程序部署相关的方法.有同样需求的朋友可以参考一下,以免少走一些弯路. .net core程序部署主要工作就是 ...
- HDU 4081 Qin Shi Huang's National Road System(最小生成树/次小生成树)
题目链接:传送门 题意: 有n坐城市,知道每坐城市的坐标和人口.如今要在全部城市之间修路,保证每一个城市都能相连,而且保证A/B 最大.全部路径的花费和最小,A是某条路i两端城市人口的和,B表示除路i ...