164. Maximum Gap

题目:
Given an unsorted array, find the maximum difference between the successive elements in its sorted form.

Try to solve it in linear time/space.

Return 0 if the array contains less than 2 elements.

You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.

解答:
这题挺难理解的,但是可以举例,比如说现在有1, 3, 5, 9。那么我们可以把它分成3个bucket来装,min表示在这个bucket范围中,存在的最小数和最大数。这个bucket的长度是最小可能的最大差值。(如果哪个差值比这个还小,那么为了填补这个小差值,就必然存在另一个差值比它大,那么这个数组的最大差值就比当前bucket大。所以均分下来的bucket是最小可能的最大差值)

b0: (1, 3) min = Integer.max, max = Integer.min
b1: (4, 6) min = Integer.max, max = Integer.min
b2: (7, 9) min = Integer.max, max = Integer.min

然后我们来看这个数组里的数在哪个bucket里,用(nums(i) - min) / gap来得到,
第一个数1在b0中,所以我们更新:
b0: (1, 3) min = 1, max = 1;
第二个数3在b0中,所以我们更新:
b0: (1, 3) min = 1, max = 3;
第三个数5在b1中,所以我们更新:
b1: (4, 6) min = 5, max = 5;
.
.
依次这样下去。
因为每个bucket中的最大值-最小值就是我们最小的gap, 所以我们不用计算相邻的两个数,我们只要比较后一个bucket中的最小值和前一个bucket中的最大值相差多少,取最大相差的值就是最终的结果。注意考虑min和max两个边界值也要加进去。

public int maximumGap(int[] nums) {if (nums == null || nums.length < 2) return 0;int len = nums.length;int max = nums[0], min = nums[0];for (int i = 0; i < nums.length; i++) {max = Math.max(max, nums[i]);min = Math.min(min, nums[i]);}//Math.ceil与最小的比这个数大的蒸熟,使bucket可以包含所有数int gap = (int)Math.ceil((double)(max - min) / (len - 1));int[] BucketsMIN = new int[len - 1];int[] BucketsMAX = new int[len - 1];Arrays.fill(BucketsMIN, Integer.MAX_VALUE);Arrays.fill(BucketsMAX, Integer.MIN_VALUE);for (int num : nums) {//不考虑边界,所以把边界的min和max都拿出来,单独再考虑if (num == min || num == max) continue;int bucket = (num - min) / gap;BucketsMIN[bucket] = Math.min(BucketsMIN[bucket], num);BucketsMAX[bucket] = Math.max(BucketsMAX[bucket], num);}int result = 0;int previous = min;for (int i = 0; i < len - 1; i++) {if (BucketsMIN[i] == Integer.MAX_VALUE && BucketsMAX[i] == Integer.MIN_VALUE) {continue;}result = Math.max(result, BucketsMIN[i] - previous);previous = BucketsMAX[i];}result = Math.max(result, max - previous);return result;}

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

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

相关文章

java声明和初始化数组_Java 中初始化数组

数组是一种有用的数据类型&#xff0c;用于管理在连续内存位置中建模最好的集合元素。下面是如何有效地使用它们。-- Chris Hermansen&#xff08;作者&#xff09;有使用 C 或者 FORTRAN 语言编程经验的人会对数组的概念很熟悉。它们基本上是一个连续的内存块&#xff0c;其中…

Java第二次实验报告——Java面向对象程序设计

北京电子科技学院&#xff08;BESTI&#xff09;实 验 报 告课程名称&#xff1a;java程序设计实验 班级&#xff1a;1352 姓名&#xff1a;洪韶武 学号&#xff1a;20135219成绩&#xff1a; 指导教师&#xff1a;娄嘉鹏…

IOS 多线程04-GCD详解 底层并发 API

IOS 多线程04-GCD详解 底层并发 API 注&#xff1a;本人是翻译过来&#xff0c;并且加上本人的一点见解。 前言 想要揭示出表面之下深层次的一些可利用的方面。这些底层的 API 提供了大量的灵活性&#xff0c;随之而来的是大量的复杂度和更多的责任。在我们的文章常见的后台实践…

类初始化的一道面试题

下面的代码counter1,counter2输出的结果是什么&#xff0c;把第10行放到12行后面&#xff0c;ounter1,counter2输出的结果是什么&#xff1f; 为什么&#xff1f; 1 public class Test {2 public static void main(String[] args) {3 System.out.println(Singleton…

mac pandas文件路径_Mac进阶必看:如何利用Automator快速获取文件路径

在重装mac os系统后&#xff0c;有的小伙伴会选择手动恢复数据&#xff0c;但是却发现一些软件比如FTP、iterm2、foxmail等这些软件的配置信息没有了&#xff0c;其实数据并没有丢失哦&#xff01;一般情形下数据都会在/Users/dcm/Library下&#xff0c;但是Mac默认是不显示这些…

深入分析Spring 与 Spring MVC容器

spring官方文档中对web容器的说明spring配置文件默认名字——applicationContext.xml参考链接&#xff1a;https://www.cnblogs.com/hujunzheng/p/5673377.htmlSpring的启动过程&#xff1a;首先&#xff0c;对于一个web应用&#xff0c;其部署在web容器中&#xff0c;web容器提…

mysql jpa 批注 视图_通过JPA注解映射视图的实体类 jpa 视图 无主键 @Query注解的用法(Spring Data JPA) jpa 使用sql语句...

参考: https://blog.csdn.net/qq465235530/article/details/68064074https://www.cnblogs.com/zj0208/p/6008627.html这里主要说一下怎么用jpa映射一个视图的实体类&#xff0c;其实跟表映射一样&#xff0c;就是需要添加一个空的主键id标识package com.cf.bus.core.rs.templat…

笨办法学C 练习45:一个简单的TCP/IP客户端

练习45&#xff1a;一个简单的TCP/IP客户端 原文&#xff1a;Exercise 45: A Simple TCP/IP Client 译者&#xff1a;飞龙 我打算使用RingBuffer来创建一个非常简单的小型网络测试工具&#xff0c;叫做netclient。为此我需要向Makefile添加一些工具&#xff0c;来处理bin/目录下…

Cppunit 源码 SynchronizedObject

运用C的构造&#xff0c;析构进行&#xff0c;加锁解锁。在函数进入的时候定义临时变量。任何一个分支推出的时候都会调用析构函数。避免多分支出现的问题。 1 #ifndef CPPUNIT_SYNCHRONIZEDOBJECT_H2 #define CPPUNIT_SYNCHRONIZEDOBJECT_H3 4 #include <cppunit/Portabil…

hive安装需要安装mysql区别_HIVE安装系列之一:在Linux中安装mysql,为其作为hive的metastore做准备...

安装mysql的Linux机器是Centos6的系统&#xff0c;机器名字叫combanc05mysql我采用的是5.5版本。安装过程中需要解决新旧版的冲突问题&#xff0c;并允许mysql被远程访问。以便其作为hive的元数据仓库顺利运行。下载到mysql在linux中安装mysql&#xff0c;首先可以到官网去找Li…

数据预处理和特征工程

一、数据预处理 1.数据采集 2.数据格式化&#xff08;存储格式等&#xff09; 3.数据清洗&#xff1a;去掉脏数据 简单直观可以看出的不可能数据 组合或统计属性判定 缺失值处理 1.删除元祖&#xff1a;删除这一条记录或者一列特征&#xff0c;适合记录或者特征占总样本比例很小…

个人作业五:四则运算二

四则运算2 一、设计思路&#xff1a; 1、题目避免重复&#xff1a; (1)利用系统时间来产生随机数&#xff0c;重复率会降低。 (2)建立链表&#xff0c;逐个判断。可读取写入文件。 2、可定制&#xff08;数量/打印方式&#xff09;&#xff1a; (1)格式有默认值; (2)可以选择重…

javascript继承模式原理与示例深入剖析

原型链ECMAScript 中描述了原型链的概念&#xff0c;并将原型链作为实现继承的主要方法。 其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。简单回顾一下构造函数、原型和实例的关系&#xff1a;每个构造函数都有一个原型对象&#xff0c;原型对象都包含一…

mysql innodb_sort_buffer_size_mysql优化---第7篇:参数 innodb_buffer_pool_instances设置

摘要&#xff1a;1 innodb_buffer_pool_instances可以开启多个内存缓冲池&#xff0c;把需要缓冲的数据hash到不同的缓冲池中&#xff0c;这样可以并行的内存读写。2 innodb_buffer_pool_instances参数显著的影响测试结果&#xff0c;特别是非常高的 I/O 负载时。3 实验环境下&…

函数和过程

函数&#xff1a;def test(s)&#xff1a; ... return 过程没有return&#xff0c;函数有。但是过程也是函数 def test0():过程msgi am houndprint(msg) def test1():函数msgi am dogprint(msg)return msg t1test0() t2test1() print(t1) print(t2) i am houndi am dogNone 没…

关于html的一些杂技

html预定义字符指的是 :< > html实体指的是 $amp 等 php中htmlspeciachar()就是讲html预定义字符转换成html实体. 浏览器渲染时,会将html实体转换成html预定义字符显示出来,但是查看html源码是显示的还是html实体. 而如果查看源码时(ctrlu),中<>的内容不会再网页…

cordova 5.0版本说明

2015/04/21发布Cordova 5.0.0! 1&#xff09;插件从Cordova plugins registry&#xff08;CPR&#xff09;全部移到npm&#xff0c;并且重新命名 ***org.apache.cordova.* → cordova-plugin-* 旧&#xff09;$ cordova plugin add org.apache.cordova.console 新&#xff09…

mysql综合查询索引优化_MySQL数据库SQL优化之确定问题使用索引提高查询效率

在EXPLAIN分析SQL中&#xff0c;已经可以确定是对客户表customet的全表扫描导致效率的不理想&#xff0c;那么对客户表customer的email字段创建索引&#xff0c;具体如下:mysql> create index idx_email on customer(email);创建索引后&#xff0c;再看一下这条语句的执行计…

无法找到python第三方库的处理方法

如果工程目录和python安装目录不是同一个&#xff0c;那么要将第三方库复制一份到你的工程目录的site-package目录中&#xff0c;这样工程才能引用。反正我是这样的&#xff0c;大家如果遇到类似情况可以参考。 我也在纳闷&#xff0c;像c#这些你在引用第三方库时自动就给你复制…

python-列表

list列表是一个有序的集合&#xff0c;可以随时添加和删除 len(XXX)函数计算XXX这个列表元素个数 还有一个概念就是索引index xxx(2) xxx列表的第三个元素 xxx(-2) xxx列表的倒数第二个元素 append 添加元素到末尾 insert 插入元素到指定的位置 pop()  删除末尾的元素…