力扣164最大间距

news2024/11/26 16:41:54

1.前言

        因为昨天写了一个基数排序,今天我来写一道用基数排序实现的题解,希望可以帮助你理解基数排序。

这个题本身不难,就是线性时间和线性额外空间(O(n))的算法,有点难实现

 基数排序的时间复杂度是O(d*(n+radix)),其中d是最大值的位数,n是数组长度,radix是基数(10)然后化简就是 O(n) 

2.思路分析

  1. 首先,找到待排序数组中的最大值,确定最大值的位数。假设最大值是max,位数是d。

  2. 创建10个桶(0-9),每个桶用来存放对应位数上的数字。

  3. 从低位(个位)开始,根据当前位数的值将待排序数组中的数字放入对应的桶中。

  4. 将桶中的数字按照顺序取出,覆盖原数组,然后进入下一位数的排序。

  5. 重复步骤3和步骤4,直到排完最高位(即 d 位)。

  6. 最后,遍历排序后的数组,计算相邻数字之间的差值,找到最大的差值,即为最大间距。

3.代码实现 

这里我获取最大值最小值使用了stream流,下面我来介绍一下

int maxVal = Arrays.stream(arr).max().getAsInt();  获取最大值

//Arrays.stream(arr) 将数组转换为一个流。
//max() 方法找到流中的最大值,返回一个 OptionalInt 对象。
//getAsInt() 方法从 OptionalInt 对象中获取最大值作为 int 类型的值。如果最大值不存在(即数组为空),则会抛出 NoSuchElementException 异常。

/*
* 基数排序实现  求相邻元素的差值(最大间距)
*
* */

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class sortHomework3 {
    public static int maximumGap(int[] nums) {
        radixSort(nums);
        int r = 0;
        for (int i = 1; i < nums.length; i++) {
            r = Math.max(r,nums[i] - nums[i - 1]);
        }
        return r;
    }
    public static void radixSort(int[] arr) {
        if (arr == null || arr.length == 0){
            return;
        }
        int max = Arrays.stream(arr).max().getAsInt();//获得最大值,确定最高位数
        int min = Arrays.stream(arr).min().getAsInt();//获得最小值
        int digit = 1; // 从最低位开始排序
        int base = 10; // 基数为10,即十进制(是个桶)
        // 转换负数为正数
        if (min < 0) {
            max -= min;
            for (int i = 0; i < arr.length; i++) {
                arr[i] -= min;
            }
        }
        while(max / digit > 0){
            countingSort(arr, base, digit);
            digit *= base;//处理更高位数
        }

        //排序完毕后
        // 将转换后的正数转换回负数
        if (min < 0) {
            for (int i = 0; i < arr.length; i++) {
                arr[i] += min;
            }
        }


    }

    private static void countingSort(int[] arr, int base, int digit) {
        // 定义桶的大小 (里面的泛型<表示动态数组>)为10个桶
        List<List<Integer>> buckets = new ArrayList<>(10);
        for (int i = 0; i < 10; i++) {
            buckets.add(new ArrayList<>()); // 创建空的桶(不创建空桶默认里面存的都是null不是桶)
        }
        for (int i : arr) {
            int index = i / digit % base;//获得位数
            buckets.get(index).add(i);//添加到集合中
        }
        int k = 0;
        //将元素在插入arr中
        for (int i = 0; i < buckets.size(); i++) {
            if (buckets.get(i).isEmpty()){
                continue;
            }
            //把各个桶中的元素存储到数组中
            for (int j = 0; j < buckets.get(i).size(); j++) {
                arr[k++] = buckets.get(i).get(j);
            }
            //取出来一个桶,咱就删除一个桶
            buckets.get(i).clear();
        }
    }

    public static void main(String[] args) {
        int[] arr = {5, 2, 8000, 3, 1};
        int[] expected = {1, 2, 3, 5, 8};
        System.out.println(Arrays.toString(arr));
        maximumGap(arr);
        System.out.println(Arrays.toString(arr));
    }
}

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

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

相关文章

HTML图片标签(2) HTML5+CSS3+移动web 前端开发入门笔记(三)

图片标签 HTML中&#xff0c;可以使用标签来插入图片。具体的语法为&#xff1a; <img src"图片路径" alt"替代文本">其中&#xff0c;src属性用于指定图片的路径&#xff0c;可以是相对路径或绝对路径。常见的有相对当前HTML文件的路径&#xff0…

Golang 实现接口和继承

小猴子继承了老猴子&#xff0c;这样老猴子拥有的能力包括字段&#xff0c;方法就会自动的被老猴子继承。 小猴子不需要做任何处理就可以拿到老猴子的字段和它的方法&#xff0c;因为是继承关系。 但是小猴子还会其他的技能&#xff0c;比如还会像小鸟一样飞翔&#xff0c;希…

国际减灾日 | 智慧减灾——百分点科技的数据科学视角

国际减轻自然灾害日简称“国际减灾日”&#xff0c;由联合国于1989年设立&#xff0c;旨在关注全球灾害风险&#xff0c;呼吁各国政府、组织和个人积极参与减灾工作&#xff0c;以保护人民生命财产安全。今年10月13日是第34个国际减灾日&#xff0c;主题为“共同打造有韧性的未…

卫星影像如何插入到AutoCAD使用

工具 Bigemap gis office地图软件 BIGEMAP GIS Office-全能版 Bigemap APP_卫星地图APP_高清卫星地图APP 第一步&#xff1a; 首先需要下载影像&#xff0c;选择一个区域下载&#xff0c;影像下载方式有以下几种&#xff1a; 那么通过下载方式选择好了范围以后&#xff0c;选…

【C++】-c++11的知识点(中)--lambda表达式,可变模板参数以及包装类(bind绑定)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

基于Labview的噪声采集分析系

目录 摘 要......................................................................................................................... 3 第一章 绪论.............................................................................................................…

印尼全面禁止直播带货

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 电商的改变要来了? 印尼为了保护中小企业全面禁止电商&#xff0c;原因是&#xff1a;电商富的是少数人&#xff0c;只有实体才能带动经济。另外除了印尼&#xff0c;马来西亚、越南也要审查直播…

html设置前端加载动画

主体思路参考&#xff1a; 前端实现页面加载动画_边城仔的博客-CSDN博客 JS图片显示与隐藏案例_js控制图片显示隐藏-CSDN博客 1、编写load.css /* 显示加载场景 */ .loadBackGround{position: absolute;top: 0px;text-align: center;width: 100%;height: 100vh;background-c…

十六、【橡皮擦工具组】

文章目录 橡皮擦背景橡皮擦1. 一次取样2. 连续取样3. 取样背景色板 魔术橡皮擦 橡皮擦 橡皮擦跟我们平常生活中所用的橡皮擦是一样&#xff0c;它是将图层的内容擦除,只剩下空白部分。另外当我们按住Alt的键去擦除空白部分的时候&#xff0c;也可以将背景的部分显示出来。 另…

第三章 内存管理 二、内存管理的概念

目录 一、内存空间的分配与回收 内存空间的分配: 内存空间的回收&#xff1a; 二、内存空间的扩充 四、存储保护 五、总结 一、内存空间的分配与回收 内存空间的分配和回收是程序设计中非常重要的一环。这里简要介绍下内存空间的分配和回收。 内存空间的分配: 静态分配…

JVM 性能调优参数

JVM分为堆内存和非堆内存 堆的内存分配用-Xms和-Xmx -Xms分配堆最小内存&#xff0c;默认为物理内存的1/64&#xff1b; -Xmx分配最大内存&#xff0c;默认为物理内存的1/4。 非堆内存分配用-XX:PermSize和-XX:MaxPermSize -XX:PermSize分配非堆最小内存&#xff0c;默认为物理…

LeetCode【46】全排列

题目&#xff1a; 代码&#xff1a; 在这里插入代码片

LeetCode刷题总结 - LeetCode 热题 100 - 持续更新

LeetCode 热题 100 其他系列哈希1. 两数之和49. 字母异位词分组128. 最长连续序列 双指针27. 移除元素283. 移动零11. 盛最多水的容器剑指 Offer II 007. 数组中和为 0 的三个数42. 接雨水 滑动窗口438. 找到字符串中所有字母异位词3. 无重复字符的最长子串 字串560. 和为 K 的…

十四、【图章工具组】

文章目录 仿制图章图案图章 仿制图章 纺织图和章工具跟我们之前所用到的修补工具类似,需要我们先按住Alt键选住一块区域&#xff0c;然后调整它的硬度在用我们选择的区域去覆盖&#xff0c;需要注意的是&#xff0c;我们去做的时候尽量一笔覆盖我们想要遮住的区域: 图案图章…

BUUCTF 你竟然赶我走 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 下载附件后有一张图片。 密文&#xff1a; 解题思路&#xff1a; 有两种解题方法 方法一&#xff1a; 1、使用StegSolve打开图片。 2、打开File Format&#xff08;文件格式&#xff09; 3、拉到最下面&#…

国外互联网巨头常用的项目管理工具揭秘

大型互联网公司有涉及多个团队和利益相关者的复杂项目。为了保持项目的组织性和效率&#xff0c;他们中的许多人依赖于项目管理工具。这些工具有助于跟踪任务&#xff0c;与团队成员沟通&#xff0c;并监控进度。让我们来看看一些大型互联网公司正在使用的项目管理工具。 1、Zo…

Flink之DataStream API开发Flink程序过程与Flink常见数据类型

开发Flink程序过程与Flink常见数据类型 DataStream APIFlink三层APIDataStream API概述 开发Flink程序过程添加依赖创建执行环境执行模式创建Data Source应用转换算子创建Data Sink触发程序执行示例 Flink常见数据类型基本数据类型字符串类型时间和日期类型数组类型元组类型列表…

【Java 进阶篇】深入了解JavaScript中的函数

函数是JavaScript编程中的核心概念之一。它们是可重用的代码块&#xff0c;可以帮助您组织和管理程序&#xff0c;使您的代码更具可读性和可维护性。在本篇博客中&#xff0c;我们将深入了解JavaScript中的函数&#xff0c;包括函数的基本语法、参数、返回值、作用域、闭包和高…

网安朝阳·西门子白帽黑客大赛 | 聚焦实战攻防竞赛 促进网安人才发展

2023年10月12日&#xff0c;由西门子&#xff08;中国&#xff09;有限公司、北京市朝阳区人民政府主办&#xff0c;西门子医疗系统有限公司作为赞助单位&#xff0c;北京赛宁网安科技有限公司&#xff08;赛宁网安&#xff09;、北京精典元素公关顾问有限公司承办&#xff0c;…

进程概念[上]

一、冯诺依曼体系结构 冯 • 诺依曼体系结构核心原理为&#xff1a;用户输入的数据先放到内存当中&#xff0c;CPU 读取数据的时候就直接从内存当中读取&#xff0c;CPU 处理完数据后又写回内存当中&#xff0c;然后内存再将数据输出到输出设备当中&#xff0c;最后由输出设备进…