桶排序(Bucket Sort)

. - 力扣(LeetCode)

这道题可以使用桶排序来做

桶排序(Bucket Sort)是一种排序算法,其工作原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是比较排序,它不受到O(n log n)下限的影响。

桶排序的核心在于合理设计桶的数量和每个桶的范围,使得数据能均匀分布到各个桶中,进而降低后续排序的复杂度。桶排序的步骤主要包括初始化桶确定桶的数量及每个桶对应的数据范围,遍历待排序序列将每个元素放入对应的桶中,以及对每个非空桶内部使用其他排序算法进行排序。

总的来说,桶排序是一个利用函数映射关系将数据分布到有限数量的桶中,再对每个桶内的数据进行排序,最后按顺序合并得到全局有序序列的排序算法。

官方给出的代码如下

class Solution {public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {int n = nums.length;Map<Long, Long> map = new HashMap<Long, Long>();long w = (long) t + 1;for (int i = 0; i < n; i++) {long id = getID(nums[i], w);if (map.containsKey(id)) {return true;}if (map.containsKey(id - 1) && Math.abs(nums[i] - map.get(id - 1)) < w) {return true;}if (map.containsKey(id + 1) && Math.abs(nums[i] - map.get(id + 1)) < w) {return true;}map.put(id, (long) nums[i]);if (i >= k) {map.remove(getID(nums[i - k], w));}}return false;}public long getID(long x, long w) {if (x >= 0) {return x / w;}return (x + 1) / w - 1;}
}

解释如下

  1. 使用一个HashMap(名为map)来存储数组元素的值及其对应的原始值。这个HashMap的键是数组元素的“桶”ID,值是数组元素的值。

  2. wt + 1,用作计算桶ID的间隔。桶的大小决定了算法对t的容忍度。

  3. 遍历数组nums,对于每个元素:

    • 使用getID方法计算元素的桶ID。
    • 检查当前元素的桶ID是否已经在map中存在,如果存在则说明找到了两个满足条件的元素,返回true
    • 检查当前元素的桶ID的相邻桶(即ID减1和ID加1)是否存在于map中,并且与当前元素的差的绝对值小于w。如果是,则说明找到了两个满足条件的元素,返回true
    • 将当前元素的桶ID和值(这里存储的是元素的值)放入map
    • 如果已经遍历了k个元素,那么从map中移除最旧的元素(即nums[i - k])的桶ID和值。这是为了保持map中只存储最近的k个元素的桶ID和值。
  4. 如果遍历完整个数组都没有找到满足条件的两个元素,则返回false

getID方法用于计算给定元素x的桶ID。根据x的正负性,使用不同的计算方法,以确保相同的桶ID范围。

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

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

相关文章

“AI 程序员入职系列”第二弹:如何利用通义灵码光速改写项目编程语言?

通义灵码入职阿里云云原生团队后&#xff0c;已经展示过 Ta 生成单元测试和自动生成代码的强大实力。今天&#xff0c;阿里云后端工程师云徊将从项目开发的实际需求出发&#xff0c;演示通义灵码在开发工作中可提供的帮助。 通义灵码在 Git 开发项目中起到了哪些作用&#xff…

WildCard开通GitHub Copilot

更多AI内容请关注我的专栏&#xff1a;《体验AI》 期待您的点赞&#x1f44d;收藏⭐评论✍ WildCard开通GitHub Copilot GitHub Copilot 简介主要功能工作原理 开通过程1、注册Github账号2、准备一张信用卡或虚拟卡3、进入github copilot页4、选择试用5、选择支付方式6、填写卡…

Flutter Get国际化和实现原理简析

Flutter Get国际化入门和实现原理简析 前言使用方法1、配置依赖包2、配置国际化相关参数3、配置en_US和zh_CN4、配置Translations5、 构建的页面:原理分析1、tr原理分析2、 updateLocale原理分析参考资料:前言 Flutter的Get插件提供了国际化功能,使用起来很方便,下面就其简…

设计模式:里氏代换原则(Liskov Substitution Principle,LSP)介绍

里氏代换原则&#xff08;Liskov Substitution Principle&#xff0c;LSP&#xff09;是面向对象设计原则的一部分&#xff0c;它强调子类对象应该能够替换其父类对象而不影响程序的正确性。换句话说&#xff0c;子类对象应该可以在不改变程序正确性的前提下替换掉父类对象。 …

为什么单片机控制电机需要加电机驱动

通常很多地方只是单纯的单片机MCU没有对电机的驱动能力&#xff0c;或者是介绍关于电机驱动的作用&#xff0c;如&#xff1a; 提高电机的效率和精度。驱动器采用先进的电子技术和控制算法&#xff0c;能够精准控制电机的参数和运行状态&#xff0c;提高了电机的效率和精度。拓…

Git命令汇总(持续更新)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【Flutter 面试题】 setState 在哪种场景下可能会失效?

【Flutter 面试题】 setState 在哪种场景下可能会失效? 文章目录 写在前面口述回答补充说明示例1:`setState` 在已销毁的Widget中使用示例2:在构建过程中调用`setState`写在前面 🙋 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云社区专家博主,51CTO专家…

【Hello算法】 > 第 3 关 >栈与队列

数据结构 之 数组与链表 1 栈 / 栈的常见操作、实现、应用2 队列 /队列的常见操作、实现、应用3 双向队列4 Tips ———————————————————————————————————————————————————————————- ————————————————…

Hybrid Homomorphic Encryption:SE + HE

参考文献&#xff1a; [NLV11] Naehrig M, Lauter K, Vaikuntanathan V. Can homomorphic encryption be practical?[C]//Proceedings of the 3rd ACM workshop on Cloud computing security workshop. 2011: 113-124.[MJS16] Maux P, Journault A, Standaert F X, et al. To…

STM32应用开发教程进阶--UART串口重定向(printf)

实现目标 1、掌握STM32 HAL库的串口重定向 2、具体目标&#xff1a;1、实现printf “打印”各种常用的类型的数据变量 一、串口“打印” UART串口通信协议是我们常用的通信协议&#xff08;UART、I2C、SPI等&#xff09;之一&#xff0c;全称叫做通用异步收发传输器&#xf…

Druid高性能数据库连接池?SpringBoot整合MyBatis整合SpringMVC整合Druid

文章目录 Druid高性能数据库连接池&#xff1f;SpringBoot整合MyBatis整合SpringMVC整合Druid异常记录spring-boot-starter-parent作用Druid介绍什么是数据库连接池&#xff1f;为什么选择Druid数据库连接池整合SpringBoot,MyBatis,SpringMVC,Druid到Maven项目的真个流程pom文件…

Android isNetworkConnected如何判断APP连接到了无网络热点

在开发移动应用时&#xff0c;处理网络状态是一项基础且关键的任务。尤其是辨别出设备是否连接到了一个实际上没有互联网接入的WiFi热点&#xff08;比如需要登录或者付费才能上网的公共Wi-Fi&#xff09;&#xff0c;对于保持良好用户体验非常重要。 第一步&#xff1a;基本网…

OSPF域间路由防环原则

1.域间路由防环原则 ①原则一 1&#xff09;为了避免区域间的环路&#xff0c;OSPF规定不同区域间的路由交互只能通过ABR实现。 2&#xff09;ABR是连接到骨干区域的&#xff0c;所以在区域设计上规定&#xff0c;所有非骨干区域都要连接到骨干区域。区 域间的通讯需要通…

Spring Gateway 网关常见配置说明

前言 Spring Gateway 是基于 Spring Framework 的 API 网关&#xff0c;它为微服务架构提供了路由、监控、弹性以及安全性等功能。Spring Gateway 使用非阻塞 API 和高性能的反应式编程模型来提供服务。 版本说明 本文的选项在多个最近的 Spring Cloud Gateway 版本中都是有…

python5

python应用实例 0.python基础1. python获取文件夹下所有文件的两种方式方法一&#xff1a;递归方法二&#xff1a;os.walk()&#xff08;推荐&#xff09; 2. python 读写csv文件写入读取 3. python 读写xml文件 0.python基础 python基础1 python基础2 python基础3 python基础…

C语言进阶:进阶指针(下)

一、 函数指针数组 我们都知道 数组是一个存放相同类型数据的存储空间 那我们已经学习了指针数组 那么函数有没有对应的指针数组呢&#xff1f; 如果有那应该怎么定义呢&#xff1f; 1. 函数指针数组的定义 我们说 函数指针数组的定义 应该遵循以下格式 int (*p[10])(); 首…

SpringBoot Aop使用篇

Getting Started SpringBoot AOP的实践 AOP相关的概念&#xff1a; Aspect&#xff08;切面&#xff09;&#xff1a; Aspect 声明类似于 Java 中的类声明&#xff0c;在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。就是抽离出来的逻辑类&#xff0c;比如日志、权限…

通过鼠标移入移出增加页面交互效果

有时候希望给用户带来一些炫酷的交互体验&#xff0c;常常会通过鼠标触发一些动态的样式效果&#xff01;&#xff01;&#xff01;这里简单总结一下&#xff0c;以后会不定时补充&#xff0c;谨以此博客作为记录&#xff01; 增加边框阴影 有时候加一点阴影的效果&#xff0c…

设计模式-行为型模式-观察者模式

观察者模式用于定义对象间的一种一对多的依赖关系&#xff0c;使得当一个对象状态变化时&#xff0c;其所有依赖对象都会收到通知并自动更新 /*** 行为型模式--观察者模式* 观察者模式用于定义对象间的一种一对多的依赖关系&#xff0c;使得当一个对象状态变化时&#xff0c;其…

C++及QT的线程学习

目录 一. 线程学习 二. 学习线程当中&#xff0c;得到的未知。 1. 了解以下MainWindow和main的关系 2. []()匿名函数 有函数体&#xff0c;没有函数名. 3. join和detach都是用来管理线程的生命周期的&#xff0c;它们的区别在于线程结束和资源的回收。 4. operator()() 仿…