借助桶排序思想完成的一道题

问题:

数组排序之后的相邻数的最大差值;

嗯,你可以排序,然后找相邻的最大差值。

但是你觉得这么简单我写他干啥。

最优解:时间复杂度O(N),空间O(1)

 

 

 

 

那我们开始说这种方法:

1)遍历所有数,找到最小值和最大值:min和max

2)设数组长度为n,我们准备n+1个桶

3)把max放进最后一个桶里,min放到第一个桶里

4)每一个桶都负责放一个范围内的数字,负责的范围大小是(max-min)/n。

(比如长度为10,最小值为10,最大值为110,那么准备11个桶,第一个桶放[10,20)的数字,第二个桶放[20,30)的数字......)

重点来啦:因为有n+1个桶,有n个数字,我们就发现了一个问题:必定会有空的桶

为什么我们一定要有空的桶呢?

 

这样我们就可以做到:桶内的相邻数字的差,一定没有不同桶之间的数字的差大

有了这个结论我们可以做什么呢?

其实找相邻桶和桶之间的差就好啦,桶内的那些情况根本不用关心

想到这里,我们发现桶里根本不用关心到底有几个数,他们的差是多少,只要记录每个桶的最大值最小值即可。

 

最后一点小问题啦:对于一个数num,他应该放在哪个桶,最好推个公式吧?
它应该被放在(num-min)*len/(max-min)这个桶里。也不难推。

最后就是写代码啦。

public class MaxGap {public static int maxGap(int[] nums) {if (nums == null || nums.length < 2) {return 0;}int len = nums.length;int min = Integer.MAX_VALUE;int max = Integer.MIN_VALUE;for (int i = 0; i < len; i++) {min = Math.min(min, nums[i]);max = Math.max(max, nums[i]);}if (min == max) {return 0;}boolean[] hasNum = new boolean[len + 1];//记录是否空int[] maxs = new int[len + 1];//桶内最大值int[] mins = new int[len + 1];//桶内最小值int bid = 0;//放入桶中for (int i = 0; i < len; i++) {bid = bucket(nums[i], len, min, max);mins[bid] = hasNum[bid] ? Math.min(mins[bid], nums[i]) : nums[i];maxs[bid] = hasNum[bid] ? Math.max(maxs[bid], nums[i]) : nums[i];hasNum[bid] = true;}int res = 0;int lastMax = maxs[0];int i = 1;//相邻桶求最大差值for (; i <= len; i++) {if (hasNum[i]) {res = Math.max(res, mins[i] - lastMax);lastMax = maxs[i];}}return res;}public static int bucket(long num, long len, long min, long max) {return (int) ((num - min) * len / (max - min));}public static void main(String[] args) {int[] arr = {};System.out.println(maxGap(arr));}}

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python(3)-Pycharm基本使用技巧

初识Pycharm1.界面2.恢复初始设置3.第一次打开Pycharm4.打开一个项目5.设置解释器的版本。6.新建项目7.编辑器、控制台的字体设置Pycharm–适合于开发管理大型项目&#xff0c;项目是用以解决复杂功能的软件。1.界面 导航区–主要有什么文件 编辑区–编辑具体的文件 控制台窗口…

推荐算法概述(01)

1.什么是推荐系统 用户没有明确的需求&#xff0c;你需要的是一个自动化的工具&#xff0c;它可以分析你的历史兴趣&#xff0c;从庞大的电影库中找到几部符合你兴趣的电影供你选择。这个工具就是个性化推荐系统。 推荐系统的主要任务 推荐系统的任务就是联系用户和信息&…

何为布隆过滤器

问题的提出 我们有一个不安全网页的黑名单&#xff0c;包含了100亿个黑名单网页的URL,每个网页URL最多占用64B.。 现在我们要设计一个网页过滤系统&#xff0c;这个系统要判断该网页是否在黑名单里&#xff0c;但是我们的空间有限&#xff0c;只有30GB. 允许有万分之一的判断…

推荐算法--利用用户行为数据(02)

文章目录目录1.什么是用户行为数据&#xff1f;1.1用户行为分类2.用户行为数据如何使用&#xff1f;2.1 用户活跃度和物品流行度的分布2.2 用户活跃度和物品流行度的关系2.3 协同过滤算法3.实验设计和算法评测4.基于邻域的的推荐算法4.1 基于用户的协同过滤算法4.2 基于物品的协…

《Head First设计模式》第九章(2)组合模式

组合模式 ​ 基于前一篇迭代模式的案例进行需求更新&#xff0c;餐厅的菜单管理系统需要有煎饼屋菜单和披萨菜单。现在希望在披萨菜单中能够加上一份餐后甜点的子菜单。 在迭代模式中&#xff0c;披萨菜单是用数组维护的&#xff0c;我们需要让披萨菜单持有一份子菜单&#xf…

Python(4)--Pycharm安装、使用小技巧

Pycharm安装1.专业版Pycharm 安装2.设置Pycharm桌面快捷图标3.Linux卸载一个软件4.教育版Pycharm的安装5.多文件项目演练&#xff08;Pycharm针对学生和教师开发了免费使用版&#xff09;1.专业版Pycharm 安装 1.官网下载安装包 .tar.gz 2.解压缩 tar -zxvf 文件名 3.移动解压…

推荐算法--推荐系统冷启动问题(03)

文章目录目录1.什么是冷启动问题&#xff1f;1.1冷启动问题1.2 冷启动问题的分类1. 用户冷启动2 物品冷启动3 系统冷启动2.如何解决冷启动问题&#xff1f;2.1利用用户注册信息2.2选择合适的物品启动用户的兴趣2.3利用物品的内容信息2.4 发挥专家的作用目录 1.什么是冷启动问题…

《Head First 设计模式》第十章-状态模式 状态模式

状态模式 策略模式和状态模式是双胞胎&#xff0c;在出生时才分开。你已经知道&#xff0c;策略模式是围绕可以互换的算法来创建成功业务的&#xff0c;然而&#xff0c;状态走的是更崇高的路&#xff0c;它通过改变对象内部的状态来帮助对象控制自己的行为。 定义状态模式 …

推荐算法--利用用户标签数据(04)

文章目录流行的推荐系统通过3种方式联系用户兴趣和物品 &#xff08;1&#xff09;&#xff1a;利用用户喜欢过的物品&#xff0c;给用户推荐与他喜欢过的物品相似的物品&#xff0c;这是基于物品的算法。 &#xff08;2&#xff09;&#xff1a;利用和用户兴趣相似的其他用户…

Python(5)-注释

Python注释1.单行注释2. 多行注释&#xff08;块注释&#xff09;3.注释的使用和代码规范pyhton 的注释 使用自己熟悉的语言&#xff08;中文&#xff09;&#xff0c;解释代码。Python解释器在执行文件时不会执行井号右边边的内容。1.单行注释 # 井号后面跟着注释内容 灰灰的虚…

网络原理知识点总结

第一章&#xff1a; 计算机网络系统由资源子网和通信子网组成。 计算机网络系统主要由网络通信系统、操作系统和应用系统构成 互联网基础结构发展的三个阶段&#xff1a; 第一阶段&#xff1a;从单个网络 ARPANET 向互联网发展的过程。 第二阶段&#xff1a;建成了三级结构…

推荐算法--时效性(05)

时效性 推荐系统应该考虑时间效应&#xff0c;因为用户的兴趣是有时间变化的。用户一年前喜欢的东西现在不一定感兴趣&#xff0c;相比于推荐过去喜欢的物品&#xff0c;推荐用户近期喜欢的物品更有参考价值。而在新闻更是如此&#xff0c;推荐过去跟用户兴趣一致的新闻已经失去…

推荐算法--推荐系统架构(06)

外围架构一般来说&#xff0c;每个网站都有一个 UI 系统&#xff0c;UI 系统负责给用户展示网页并和用户交互。网站会通过日志系统将用户在 UI 上的各种各样的行为记录到用户行为日志中。 从上面的结构可以看到&#xff0c;除了推荐系统本身&#xff0c;主要还依赖两个条件--界…

Python(6)-算数运算符

算数运算符1.算数运算符2.优先级1.算数运算符 加 减- 乘* 除/ 取商// 取余数% 幂**(能算n次方&#xff1a; 2**38&#xff0c;一直以为只能算平方) 扩展&#xff1a; 乘法用于字符串&#xff1a;字符串重复指定的次数&#xff0c;要拼接的次数很长时&#xff0c;用乘号很方便…

推荐算法--其他信息(07)

文章目录目录1.利用上下文信息1.1时间上下文1.2地点上下文2.利用网络社交数据2.1 获取网络社交数据途径2.2 社交网络数据2.3 基于社交网络的推荐2.4 推荐算法2.5 给用户推荐好友目录 1.利用上下文信息 1.1时间上下文 用户的兴趣是随着时间变化的&#xff0c;三天打鱼两天晒网…

Python(7)-程序执行的原理

程序执行的原理1.计算机中的三个核心部件2.程序执行的原理3.程序的作用1.计算机中的三个核心部件 CPU&#xff1a;中央处理区&#xff0c;超大规模的集成电路&#xff0c;负责处理数据、计算 内存&#xff1a;临时存储数据&#xff0c;断电数据消失&#xff0c;读取数据快 硬盘…

橙白oj 2017级《算法分析与设计》-练习02

注&#xff1a;A题我以为给新生出的&#xff0c;应该贼简单&#xff0c;是按顺序消灭&#xff0c;卡了十几分钟&#xff0c;成了最后一个ac的题&#xff0c;真是菜的真实。 Problem A: Description 白细胞是人体与疾病斗争的“卫士”。当病菌侵入人体体内时&#xff0c;白细胞…

python(9)-变量、input函数

变量、input函数1.变量的定义(不可变对象)2.变量的类型3.变量的命名规范4. 不同类型的数据计算5.类型转换函数6.input()7.Tips程序是用来处理数据的&#xff0c;而变量是用来存储数据的。 关于函数&#xff0c;是一个提前准备好的代码&#xff1b;可以直接使用&#xff0c;不用…

推荐算法--总结(08)

一、推荐系统结构二、推荐引擎算法&#xff08;Algorithm&#xff09;1、协同过滤推荐算法1.1 关系矩阵与矩阵计算1.1.1 用户与用户&#xff08;U-U矩阵&#xff09;1.1.2 物品与物品&#xff08;V-V矩阵&#xff09;1.1.3 用户与物品&#xff08;U-V矩阵&#xff09;1.1.4 奇异…

算法总结-1算法入门

1.0 前言 算法&#xff08;Algorithm&#xff09;是指解题方案的准确而完整的描述&#xff0c;是一系列解决问题的清晰指令&#xff0c;算法代表着用系统的方法描述解决问题的策略机制。也就是说&#xff0c;能够对一定规范的输入&#xff0c;在有限时间内获得所要求的输出。 …