164.最大间距

目录

  • 题目
  • 解法
      • 1. 初始化步骤
      • 2. 创建桶
      • 3. 填充桶
      • 4. 计算最大间隔
        • 遍历桶:
      • 最终结果
      • 结论
  • int minVal = *min_element(nums.begin(), nums.end());这里为什么要带*号
      • 解释 `*` 号的作用:
      • 总结

题目

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

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

解法

class Solution {
public:int maximumGap(vector<int>& nums) {int n = nums.size();if (n < 2) {return 0;}int minVal = *min_element(nums.begin(), nums.end());int maxVal = *max_element(nums.begin(), nums.end());int d = max(1, (maxVal - minVal) / (n - 1));int bucketSize = (maxVal - minVal) / d + 1;vector<pair<int, int>> bucket(bucketSize, {-1, -1});  // 存储 (桶内最小值,桶内最大值) 对,(-1, -1) 表示该桶是空的for (int i = 0; i < n; i++) {int idx = (nums[i] - minVal) / d;if (bucket[idx].first == -1) {bucket[idx].first = bucket[idx].second = nums[i];} else {bucket[idx].first = min(bucket[idx].first, nums[i]);bucket[idx].second = max(bucket[idx].second, nums[i]);}}int ret = 0;int prev = -1;for (int i = 0; i < bucketSize; i++) {if (bucket[i].first == -1) continue;if (prev != -1) {ret = max(ret, bucket[i].first - bucket[prev].second);}prev = i;}return ret;}
};

根据之前的讨论,我们需要更新桶排序的结果,考虑到 d 的计算为 2,并且 bucketSize 应为 5。我们重新演示这个过程。

1. 初始化步骤

  • 输入数组nums = [3, 6, 9, 1]

  • 计算元素数量n = 4

  • 边界条件检查n < 2,条件不满足,继续执行。

  • 计算最小值和最大值

    • minVal = 1
    • maxVal = 9
  • 计算桶的大小和数量

    • d = max(1, (maxVal - minVal) / (n - 1)) = max(1, (9 - 1) / (4 - 1)) = max(1, 2) = 2
    • bucketSize = (maxVal - minVal) / d + 1 = (9 - 1) / 2 + 1 = 4 + 1 = 5

2. 创建桶

使用 bucketSize 初始化桶,每个桶用一对 (min, max) 来存储:

vector<pair<int, int>> bucket(bucketSize, {-1, -1}); // 5个桶

初始状态:

桶 0: (-1, -1)
桶 1: (-1, -1)
桶 2: (-1, -1)
桶 3: (-1, -1)
桶 4: (-1, -1)

3. 填充桶

遍历数组 nums 并填充相应的桶:

  • 对于 3

    • 计算桶索引:idx = (3 - 1) / 2 = 1
    • 填充桶:bucket[1] = {3, 3}

    状态:

    桶 0: (-1, -1)
    桶 1: (3, 3)
    桶 2: (-1, -1)
    桶 3: (-1, -1)
    桶 4: (-1, -1)
    
  • 对于 6

    • 计算桶索引:idx = (6 - 1) / 2 = 2
    • 填充桶:bucket[2] = {6, 6}

    状态:

    桶 0: (-1, -1)
    桶 1: (3, 3)
    桶 2: (6, 6)
    桶 3: (-1, -1)
    桶 4: (-1, -1)
    
  • 对于 9

    • 计算桶索引:idx = (9 - 1) / 2 = 4
    • 填充桶:bucket[4] = {9, 9}

    状态:

    桶 0: (-1, -1)
    桶 1: (3, 3)
    桶 2: (6, 6)
    桶 3: (-1, -1)
    桶 4: (9, 9)
    
  • 对于 1

    • 计算桶索引:idx = (1 - 1) / 2 = 0
    • 填充桶:bucket[0] = {1, 1}

    最终状态:

    桶 0: (1, 1)
    桶 1: (3, 3)
    桶 2: (6, 6)
    桶 3: (-1, -1)
    桶 4: (9, 9)
    

4. 计算最大间隔

现在遍历桶并计算最大间隔:

  • ret = 0
  • prev = -1(表示没有上一个桶)
遍历桶:
  • 桶 0(1, 1)(存在)
    • prev 变为 0
  • 桶 1(3, 3)(存在)
    • 计算间隔:ret = max(0, 3 - 1) = 2
    • prev 变为 1
  • 桶 2(6, 6)(存在)
    • 计算间隔:ret = max(2, 6 - 3) = 3
    • prev 变为 2
  • 桶 3(-1, -1)(不存在),跳过。
  • 桶 4(9, 9)(存在)
    • 计算间隔:ret = max(3, 9 - 6) = 3
    • prev 变为 4

最终结果

最大间隔 ret = 3,所以返回值为 3

结论

通过这个修正后的例子,我们清楚地看到了如何使用桶排序法来实现最大间隔的计算以及每个桶中的数是如何填充和更新的。感谢你的耐心!如果还有其他问题,请随时问我。

int minVal = min_element(nums.begin(), nums.end());这里为什么要带

在 C++ 中,std::min_element 函数返回一个指向容器中最小元素的迭代器。迭代器类似于指针,可以用来访问容器中的元素。

解释 * 号的作用:

  • * 运算符用于解引用迭代器,获取迭代器指向的实际值。
  • 如果没有 * 号,min_element 只会返回一个迭代器,而不是最小元素的值。

总结

使用 * 是必需的,因为它将迭代器转换为实际值,这是在使用迭代器时常见的操作。

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

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

相关文章

Tcp_Sever(线程池版本的 TCP 服务器)

Tcp_Sever&#xff08;线程池版本的 TCP 服务器&#xff09; 前言1. 功能介绍及展示1.1 服务端连接1.2 客户端连接&#xff08;可多个用户同时在线连接服务端&#xff09;1.3 功能服务1.3.1 defaultService&#xff08;默认服务&#xff09;1.3.2 transform&#xff08;大小写转…

【Qt】qss 设置通过 addAction 添加的 QToolButton的图标

文章目录 1. 使用 QSS 和状态示例代码2. 使用 QSS 动态更改图标QSS 示例总结 在 Qt 中&#xff0c;QSS 不能直接用于为 QAction 设置图标&#xff0c;因为 QSS 主要用于样式和外观的设置&#xff0c;而不是用于数据&#xff08;如图标&#xff09;的设置。 不过&#xff0c;你…

HTB:Antique[WriteUP]

目录 连接至HTB服务器并启动靶机 1.After running an nmap scan on TCP ports we identify port 23 open. If we run another scan on UDP ports, which port do we find open? 2.What service is running on the UDP port that we identified in the previous question? …

HTTP Content-Type

HTTP Content-Type 概述 在HTTP协议中&#xff0c;Content-Type是一个非常重要的头部字段&#xff0c;它用于指示客户端请求的资源或服务器响应的内容的MIME类型。MIME&#xff08;Multipurpose Internet Mail Extensions&#xff09;类型是一种标准&#xff0c;用于标识文档…

Next.js14快速上手

文章目录 ***客户端***什么是Next项目在线地址官方文档项目创建查看项目目录结构app属于根目录 ***服务端***vercel数据库prisma 客户端 什么是Next Next.js 是一个用于构建全栈 Web 应用程序的 React 框架。您可以使用 React Components 来构建用户界面&#xff0c;并使用 Ne…

java实现日志按天打印

<?xml version"1.0" encoding"UTF-8"?> <configuration><!-- 应用名称&#xff1a;和统一配置中的项目代码保持一致&#xff08;小写&#xff09; --><property name"APP_NAME" value"mita-main"/><!--日…

京准电钟解读:NTP网络对时服务器助力厂区改造方案

京准电钟解读&#xff1a;NTP网络对时服务器助力厂区改造方案 京准电钟解读&#xff1a;NTP网络对时服务器助力厂区改造方案 1&#xff09;系统概述 时钟系统可通过网络进行管理及时间校对&#xff0c;为厂区提供高精度、全天时、全天候 的授时服务&#xff0c;统一全厂各种系统…

vue中使用 html2canvas绘制图片并下载

html2canvas 是一个非常流行的库&#xff0c;可以将 HTML 元素转换为 canvas 图像。 1. 安装 html2canvas 首先&#xff0c;你需要安装 html2canvas 库。你可以使用 npm 或 yarn 来安装&#xff1a; npm install html2canvas yarn add html2canvas 2. 在 Vue 组件中使用 h…

AudioSetCaps数据集:包含190万对来自AudioSet录音的音频-字幕对。

2024-10-21&#xff0c;由西北工业大学、西安联丰声学技术有限公司、南洋理工大学、萨里大学和中国科学院声学研究所创建了AudioSetCaps数据集&#xff0c;包含190万对来自AudioSet录音的音频-字幕对。这个数据集在音频-文本检索和自动音频字幕两项下游任务上展现了卓越的性能&…

百度翻译以及另外三款翻译工具推荐!!!

在这个全球化的时代&#xff0c;翻译工具已经成为我们生活中不可或缺的一部分。我们需要使用翻译工具来克服语言障碍&#xff0c;无论是出国旅行、商务谈判还是学术研究。那么&#xff0c;市场上有各种各样的翻译工具。有哪些好用的在线翻译软件呢&#xff1f;别担心&#xff0…

系统架构设计师教程 第2章 2.1-2计算机系统及硬件 笔记

2.1计算机系统概述 ★☆☆☆☆ 计算机系统 (Computer System) 是指用于数据管理的计算机硬件、软件及网络组成的系统。 一般指由硬件子系统和软件子系统组成的系统&#xff0c;简称为计算机。 将连接多个计算机以实现计算机间数据交换能力的网络设备&#xff0c;称为计算机网…

uniapp基础笔记

与html区别 uni-app简单来说是 vue的语法 小程序的api。 文件结构 html <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><script type"text/javascript"></script><style t…

springboot配置文件占位符${},赋值方式

一&#xff1a;配置文件内部赋值 server:port: 48080 url: http://127.0.0.1:${server.port}这时url中的${server.port}48080 二&#xff1a;系统环境变量 有时我们在看到配置文件怎么没有找到占位符的变量的设置了&#xff0c;那就有可能调用了&#xff0c;系统的环境变量 …

解决 PHP 上传数据超时 504 错误:

解决 PHP 上传数据超时 504 错误&#xff1a; 一、了解问题 1.1 什么是 PHP 上传数据超时 504 错误&#xff1f; 当我们使用 PHP 进行文件上传时&#xff0c;如果上传的文件较大&#xff0c;可能会遇到数据超时错误。超时错误通常被服务器和网关使用&#xff0c;表示网络请求…

15_LVM的磁盘管理

系列文章导航&#xff1a;01_Linux基础操作CentOS7学习笔记-CSDN博客 文章目录 一、LVM的核心概念二、LVM的工作原理三、LVM逻辑卷的创建及使用创建LVM逻辑卷删除逻辑卷 四、LVM逻辑卷的拉伸与缩减拉伸一个逻辑卷拉伸一个卷组缩小一个逻辑卷缩小卷组 五、LVM逻辑卷快照备份与还…

LabVIEW提高开发效率技巧----节省内存

在LabVIEW开发过程中&#xff0c;内存管理是保障程序稳定性和性能的关键。本文将详细介绍如何通过队列处理来节省内存&#xff0c;尤其是如何通过解耦释放不再需要的数据&#xff0c;防止内存泄漏。通过多个实际例子&#xff0c;从不同角度探讨队列处理在大数据量或长时间运行的…

HTB:CozyHosting[WriteUP]

目录 连接至HTB服务器并启动靶机 1.How many TCP ports are open on CozyHosting? 2.The webserver on TCP port 80 issues a redirect to what domain? 3.What relative path on the webserver returns a 500 error? 4.What is the Java web framework used in the we…

初识算法 · 二分查找(4)

目录 前言&#xff1a; 寻找峰值 题目解析 算法原理 算法编写 寻找旋转排序数组中的最小值 题目解析 算法原理 算法编写 寻找缺失的数字 题目解析 算法原理 算法编写 前言&#xff1a; ​本文的主题是二分查找&#xff0c;通过三道题目讲解&#xff0c;一道是寻找…

【Web开发】什么是Nuxt? 利用Nuxt快速搭建前端项目

Nuxt官网&#xff1a;https://nuxt.com/ 启动一个Nuxt项目 在vscode的项目文件终端运行以下命令&#xff1a; npx nuxilatest init <my-app>npm installnpm run dev然后就启动了一个Nuxt项目 安装Nuxt UI Nuxt UI官网&#xff1a;https://ui.nuxt.com/ npx nuxilates…

线程的同步

目录 引入 认识条件变量 快速认识接口​编辑 认识条件变量​编辑 测试代码​编辑 生产消费模型 为何要使用生产者消费者模型 理解 编写生产消费模型 BlockingQueue 单生产单消费 多生产多消费 引入 同步&#xff1a;在保证数据安全的前提下&#xff0c;让线程…