LeetCode-164. 最大间距【数组 桶排序 基数排序 排序】

LeetCode-164. 最大间距【数组 桶排序 基数排序 排序】

  • 题目描述:
  • 解题思路一:桶排序,这种方法比较简单,记住3个公式即可。如下:
  • 解题思路二:基数排序,其实和桶排序差不多,就是直接分为十个桶(0-9十位刚好十个桶)。然后按照个位,十位,百位...上面对应的数放入桶中进行排序。而基数排序可以在 O(N)的时间内完成整数之间的排序。
  • 解题思路三:0

题目描述:

给定一个无序的数组 nums,返回 数组在排序之后,相邻元素之间最大的差值 。如果数组元素个数小于 2,则返回 0 。

您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法。

示例 1:
输入: nums = [3,6,9,1]
输出: 3
解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。

示例 2:
输入: nums = [10]
输出: 0
解释: 数组元素个数小于 2,因此返回 0。

提示:
1 <= nums.length <= 105
0 <= nums[i] <= 109

解题思路一:桶排序,这种方法比较简单,记住3个公式即可。如下:

难度在于两个线性。

  1. 首先:我们期望将数组中的各个数等距离分配,也就是每个桶的长度相同,也就是对于所有桶来说,桶内最大值减去桶内最小值都是一样的。
    每个桶的长度 = max ⁡ ( 1 , ⌊ max ⁡ ( n u m s ) − min ⁡ ( n u m s ) l e n ( n u m s ) − 1 ⌋ ) \max(1,\lfloor{{\max(nums) - \min(nums)} \over {len(nums) - 1}}\rfloor) max(1,len(nums)1max(nums)min(nums)⌋)
  2. 确定桶的数量,最后的加一保证了数组的最大值也能分到一个桶。
    桶的数量 = ⌊ max ⁡ ( n u m s ) − min ⁡ ( n u m s ) 每个桶的长度 ⌋ + 1 \lfloor{{\max(nums) - \min(nums)} \over {每个桶的长度}}\rfloor + 1 每个桶的长度max(nums)min(nums)+1
  3. 确定每个数应该对应哪个桶?
    l o c a t i o n = n u m s [ i ] − min ⁡ ( n u m s ) 每个桶的长度 location = {{nums[i] - \min(nums)} \over {每个桶的长度}} location=每个桶的长度nums[i]min(nums)

我们的做法是要将数组中的数放到一个个桶里面,不断更新更大的(后一个桶内元素的最小值 - 前一个桶内元素的最大值),最后就得到了答案。

class Solution:def maximumGap(self, nums: List[int]) -> int:if len(nums)<2: return 0max_n = max(nums)min_n = min(nums)max_gap = 0each_bucket_len = max(1, (max_n-min_n) // (len(nums)-1))buckets = [[] for _ in range((max_n-min_n) // each_bucket_len + 1)]# 把数字放入桶中for i in range(len(nums)):loc = (nums[i]-min_n) // each_bucket_lenbuckets[loc].append(nums[i])# 遍历桶更新答案prev_max = float('inf')for i in range(len(buckets)):if buckets[i] and prev_max != float('inf'):max_gap = max(max_gap, min(buckets[i])-prev_max)if buckets[i]:prev_max = max(buckets[i])return max_gap

时间复杂度:O(n)
空间复杂度:O(n)
例如:
nums = [1,3,4,5,6,10,11,12,17]
每个桶的长度 = (17 - 1) / (9-1) = 2
桶的个数 = (17-1)/ 2 + 1 = 9
所以我们的桶为(左闭右开):

区间[1,3)[3,5)[5,7)[7,9)[9,11)[11,13)[13,15)[15,17)[17,19)
元素13,45,61011,1217
差值3-1 = 25-4 = 110-6 = 411-10 = 117-12 = 5
答案 = max(差值) = 5

解题思路二:基数排序,其实和桶排序差不多,就是直接分为十个桶(0-9十位刚好十个桶)。然后按照个位,十位,百位…上面对应的数放入桶中进行排序。而基数排序可以在 O(N)的时间内完成整数之间的排序。

class Solution:def maximumGap(self, nums: List[int]) -> int:if len(nums)<2: return 0 # 极端情况# 基数排序i = 0 # 记录当前正在排拿一位,最低位为1(10**i)max_n = max(nums)j = len(str(max_n))# 记录最大值的位数while i < j:buckets = [[] for _ in range(10)] # 0-9十位刚好十个桶for x in nums:buckets[int( x / (10**i)) % 10].append(x) # 将nums中对应每位放入相应的桶中nums.clear()for x in buckets:   # 将按位排序好的桶中元素放回原数组for y in x:nums.append(y)i += 1 # 进行下一位排序 个位 十位 百位...return max(nums[i]-nums[i-1] for i in range(1, len(nums)))

时间复杂度:O(n)
空间复杂度:O(n)

解题思路三:0


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

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

相关文章

孩子都能学会的FPGA:第二十二课——用FPGA实现计数时钟的奇数次分频

&#xff08;原创声明&#xff1a;该文是作者的原创&#xff0c;面向对象是FPGA入门者&#xff0c;后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门&#xff0c;作者不光让大家知其然&#xff0c;还要让大家知其所以然&#xff01;每个工程作者都搭建了全自动化的仿…

使用SQL中的LIKE操作符进行模糊匹配:原理与用法

LIKE操作符的基本原理&#xff1a; LIKE操作符用于在SELECT语句中进行模糊匹配&#xff0c;通常与通配符%一起使用。%表示匹配任意长度的任意字符&#xff0c;例如%apple%可以匹配包含apple字符串的任意位置的字符串。而其他的通配符如下&#xff1a; _ 表示匹配一个任意字符[…

内核定时器

一、时钟中断 硬件有一个时钟装置&#xff0c;该装置每隔一定时间发出一个时钟中断&#xff08;称为一次时钟嘀嗒-tick&#xff09;&#xff0c;对应的中断处理程序就将全局变量jiffies_64加1 jiffies_64 是一个全局64位整型, jiffies全局变量为其低32位的全局变量&#xff0…

用pip更新、安装python的包

查看pip的版本&#xff1a;python -m pip --version 例如&#xff0c;查看下pip的版本&#xff0c;在cmd下输入命令python -m pip --version&#xff0c;可以发现当前安装的pip的版本是23.2.1&#xff1a; 查看一个包的详情&#xff1a;python -m pip show 例如&#xff0c…

Python 调用企业微信群机器人发送消息及文件

Python 操作企业微信群机器人。 企业微信群创建机器人 &#xff1a; 安装 requests json &#xff1a; pip install requests pip install json发送消息&#xff08;markdown&#xff09; import requests import json# 企业微信机器人发送文字 def send_markdown (message, …

【信息安全】-个人敏感信息、个人信息、个人金融信息

文章目录 个人敏感信息个人敏感信息判定举例 个人信息个人信息判定举例 个人金融信息内容a) 账户信息指账户及账户相关信息b) 鉴别信息c) 金融交易信息d) 个人身份信息e) 财产信息f) 借贷信息g) 其他信息: 出处 个人敏感信息 个人敏感信息判定 个人敏感信息是指一旦泄露、非法…

xxl-job简单实用

仅仅为了记录一下xxl-job的使用&#xff0c;针对新手而言&#xff01; 1.开始准备 源码仓库地址Release Downloadhttps://github.com/xuxueli/xxl-jobDownloadhttp://gitee.com/xuxueli0323/xxl-jobDownload

cmd下查看python命令的用法

在cmd下&#xff0c;可以运行python --help或者py --help来查看python命令的用法。例如&#xff1a;

C++11改进观察者模式

观察者模式定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 先看一个简单的观察者模式是如何实现的&#xff1a; #include <iostream> #include <vector> #include <map> …

《计算机算法设计与分析(第5版)》笔记

文章目录 [toc]第一章&#xff1a;算法概述1.1|算法与程序算法性质 程序 1.2|算法复杂性分析算法复杂性时间复杂性最坏情况下的时间复杂性最好情况下的时间复杂性平均情况下的时间复杂性 渐进复杂性 O O O表示法、 Ω \Omega Ω表示法、 θ \theta θ表示法、 o o o表示法 O O …

一起学docker系列之十七Docker Compose 与手动操作的比较与优势分析

目录 1 前言2 不使用 Docker Compose2.1 启动 MySQL 容器2.2 启动 Redis 容器2.3 启动微服务容器 3 使用 Docker Compose4 使用 Docker Compose 的优势5 结语参考地址 1 前言 在当今容器化应用的开发与部署中&#xff0c;容器编排工具的选择对于简化流程、提高效率至关重要。本…

24、pytest通过xfail将测试函数标记为预期失败

官方实例 # content of test_xfail.py import pytest import syspytest.mark.xfail def test_function():print("test_function was invoked.")def valid_config():return Falsedef test_function_02():if not valid_config():pytest.xfail("failing configura…

集体建筑业总产值数据,shp/excel格式,1990-2021年,可直接下载

建筑业总产值指以货币表现的建筑业企业在一定时期内生产的建筑业产品和服务的总和。建筑业总产值包括建筑工程产值、安装工程产值和其他产值三部分内容&#xff0c;不包括境外产值。 建筑业总产值是指以货币表现的建筑业企业在一定时期内生产的建筑业产品和服务的总和。 建筑…

代数学笔记8: Sylow定理

Sylow定理 ∣ G ∣ p r ⋅ m |G|p^r\cdot m ∣G∣pr⋅m, ( m , p ) 1 (m,p)1 (m,p)1, 则 G G G中必有 p r p^r pr阶子群. 证明: 应用 例子: 15阶群必定是循环群. 因为 15 3 5 153\times 5 1535, 所以15阶群有 3 3 3阶群或 5 5 5阶群, 设3阶群有 n 3 n_3 n3​个, 5阶群有…

金蝶EAS从哪里查看 即使库存的金额?

【财务会计】——【存货核算】——【报表分析】——【存货收发存汇总表】 从这里能看到即使库存的金额

机器人制作开源方案 | 自主型收集餐盘机器人

作者&#xff1a;蔡佳怡、朱启会、郭晨杰、杨昊天、焦家辉 单位&#xff1a;西安外事学院 指导老师&#xff1a;杜喜昭、张燕 1. 产品说明 1.1 设计目的 对于如学校、工厂这种大型食堂&#xff0c;一般的收餐盘模式为用餐人用餐完毕后&#xff0c;把餐盘拿到最近的收餐盘点&…

【算法】对二分搜索的理解

二分搜索大家都很熟悉&#xff0c;首先我们先来看看基本框架 func binarySearch(nums []int, target int) int {left, right : 0, ...for ... {mid : left (right-left)/2if nums[mid] target {...} else if nums[mid] < target {left ...} else if nums[mid] > targ…

圈子社交系统:打破时间与空间的限制。APP小程序H5三端源码交付,支持二开!

在现代社会&#xff0c;社交已成为人们生活中不可或缺的一部分。然而&#xff0c;传统的社交方式往往受制于时间和空间的限制&#xff0c;使得人们难以充分发挥社交的潜力。为了解决这一问题&#xff0c;圈子社交系统应运而生。 圈子社交系统通过技术手段打破时间与空间的限制&…

Linux环境搭建SVN服务器并结合内网穿透实现远程访问

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. Ubuntu安装SVN服务二. 修改配置文件2.1 修改svnserve.conf文件2.2 修改pass…

【Linux】cp 命令使用

cp 命令 cp&#xff08;英文全拼&#xff1a;copy file&#xff09;命令主要用于复制文件或目录。 著者 由Torbjorn Granlund、David MacKenzie和Jim Meyering撰写。 语法 cp [选项]... [-T] 源文件 目标文件或&#xff1a;cp [选项]... 源文件... 目录或&#xff1a;cp [选…