Java算法:最大间距

news2024/9/20 9:42:23

请添加图片描述

在这里插入图片描述

前言

在处理数据密集型应用时,提高查询性能显得尤为关键。

解决最大间隔问题——即确定一组数值中最宽的相邻元素距离——是此类任务中的一大挑战。

该问题不仅在算法竞赛中常见,也是软件工程师面试的一个焦点,解决方法多样,包括基础的排序配合遍历技术以及更高效的线性时间策略。


在这里插入图片描述

🔍 挑战最大间距问题

今天,让我们来解决一个经典的问题:如何在未排序的数组中找到两个元素之间的最大间距?😮 这个问题看似简单,实则隐藏着不少挑战!在这里插入图片描述

我们得明白什么是“间距”。在这里,间距是指数组中任意两个元素间的差的绝对值。而且,较大值的索引必须大于较小值的索引哦!🧐

代码的实现

Java实现来啦!我们先对数组进行排序,然后遍历数组,计算相邻元素的差值并更新最大间距。

需要将无序数组变为有序数组 -> Arrays.sort()
判断数组的元素个数
for循环遍历

public class MaxGap {

    /**
     * 寻找数组中两个元素之间的最大间距。
     * @param nums 给定的整数数组。
     * @return 返回两个元素之间的最大间距。
     */
    public static int findMaxGap(int[] nums) {
     Arrays.sort(nums);  // 排序
        if (nums == null || nums.length < 2) {
            throw new IllegalArgumentException("数组至少需要包含两个元素");
        }

        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;
        // 寻找数组中的最大值和最小值
        for (int num : nums) {
            if (num < min) min = num;
            if (num > max) max = num;
        }

        // 如果数组中所有元素都是相同的,返回 0
        if (min == max) return 0;

        // 计算桶的数量,桶的数量至少为数组长度减一
        int bucketCount = nums.length - 1;
        double gap = (double)(max - min) / bucketCount;

        // 初始化桶
        Bucket[] buckets = new Bucket[bucketCount];
        for (int i = 0; i < bucketCount; i++) {
            buckets[i] = new Bucket();
        }

        // 将元素放入相应的桶中
        for (int num : nums) {
            if (num == min || num == max) continue;
            int index = (int)((num - min) / gap);
            Bucket bucket = buckets[index];
            bucket.low = Math.min(bucket.low, num);
            bucket.high = Math.max(bucket.high, num);
        }

        // 计算最大间距
        int prevHigh = min;
        int maxGap = Integer.MIN_VALUE;
        for (Bucket bucket : buckets) {
            if (bucket.low == Integer.MAX_VALUE) continue; // 空桶跳过
            maxGap = Math.max(maxGap, bucket.low - prevHigh);
            prevHigh = bucket.high;
        }
        maxGap = Math.max(maxGap, max - prevHigh);

        return maxGap;
    }

    private static class Bucket {
        int low = Integer.MAX_VALUE;
        int high = Integer.MIN_VALUE;
    }

    public static void main(String[] args ) {
        int[] nums = {3, 6, 9, 1, 0, 4};
        System.out.println(findMaxGap(nums)); // 应输出最大间距
    }
}

解决方案的效率如何呢?由于我们使用了排序,时间复杂度是O(n log n)。虽然这不是最优解,但对于大多数应用场景已经足够好了!🚀


优化代码

对于寻找两个元素之间的最大间距问题(较大值的索引必须大于较小值的索引),可以采用如下方法:

  1. 初始化一个变量 minElement 为数组的第一个元素。
  2. 初始化一个变量 maxGap 为 0。
  3. 遍历数组,对于每个元素 current
    • 如果 current 小于 minElement,则更新 minElement
    • 否则,计算 currentminElement 之间的差距,并更新 maxGap 为两者之间的较大值。
  4. 返回 maxGap

这种方法只需要遍历数组一次,因此时间复杂度为 O(n),其中 n 是数组的长度。

以下是这个方法的 Java 实现:

public class MaxGap {

    /**
     * 寻找数组中两个元素之间的最大间距。
     * @param nums 给定的整数数组。
     * @return 返回两个元素之间的最大间距。
     */
    public static int findMaxGap(int[] nums) {
        if (nums == null || nums.length < 2) {
            throw new IllegalArgumentException("数组至少需要包含两个元素");
        }

        int minElement = nums[0];
        int maxGap = 0;

        // 从数组的第二个元素开始遍历
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] < minElement) {
                // 更新最小值
                minElement = nums[i];
            } else {
                // 计算当前元素与最小值之间的差距,并更新最大间距
                maxGap = Math.max(maxGap, nums[i] - minElement);
            }
        }

        return maxGap;
    }

    public static void main(String[] args ) {
        int[] nums = {3, 6, 9, 1, 0, 4};
        System.out.println(findMaxGap(nums)); // 应输出最大间距
    }
}

这个实现简单高效,只使用了一个额外的变量来存储当前遇到的最小值,并在每次迭代时更新最大间距。这种方法适用于任何类型的有序数组,并且不需要额外的空间来存储数据,所以它的空间复杂度为 O(1)。这使得它成为了一个既高效又节省资源的解决方案。

添加要求

如果是只让数组相互间的比较,
定义方法,num[i+1]-num[i];
遍历其中的最大值比较Max出来就行啦!

下面是具体的 Java 方法实现:

public class MaxGap {

    /**
     * 寻找已排序数组中两个相邻元素之间的最大间距。
     * @param nums 已排序的整数数组。
     * @return 返回两个相邻元素之间的最大间距。
     */
    public static int findMaxGap(int[] nums) {
        if (nums == null || nums.length < 2) {
            throw new IllegalArgumentException("数组至少需要包含两个元素");
        }

        int maxGap = 0;

        // 从第二个元素开始遍历
        for (int i = 1; i < nums.length; i++) {
            // 计算当前元素与前一个元素之间的差距
            int currentGap = nums[i] - nums[i - 1];

            // 更新最大间距
            if (currentGap > maxGap) {
                maxGap = currentGap;
            }
        }

        return maxGap;
    }

    public static void main(String[] args ) {
        int[] nums = {1, 3, 6, 9, 15};
        System.out.println(findMaxGap(nums)); // 应输出最大间距
    }
}

说明

  1. 输入校验:首先检查数组是否为 null 或者长度小于2,如果是,则抛出异常。
  2. 初始化最大间距:设置一个变量 maxGap 来记录最大间距,并初始化为0。
  3. 遍历数组:从数组的第二个元素开始遍历,计算当前元素与前一个元素之间的差值。
  4. 更新最大间距:每当计算出一个新的间距时,如果这个间距比当前的最大间距大,则更新最大间距。
  5. 返回结果:遍历结束后,返回最大间距。

这种方法的前提是数组已经是排序好的。如果数组未排序,则需要先对数组进行排序。排序的时间复杂度一般为 O(n log n),这将影响整体算法的时间复杂度。如果你确实需要处理未排序的数组,可以先对其进行排序,然后再使用上述方法来找到最大间距。
Array.sort(nums);就可以有序排列;

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

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

相关文章

【B题第三套完整论文已出】2024数模国赛B题第三套完整论文+可运行代码参考(无偿分享)

基于多阶段优化的电子产品质量控制与成本管理研究 摘要 随着现代制造业和智能化生产的发展&#xff0c;质量控制和生产优化问题成为工业管理中的重要研究课题。本文针对电子产品生产过程中质量控制和成本优化中的问题&#xff0c;基于系统优化和决策分析思想&#xff0c;通过…

【C++ Primer Plus习题】12.1

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "Cow.h" u…

空气能热泵热水器

空气能热泵热水器压缩机把低温低压气态冷媒转换成高压高温气态&#xff0c;压缩机压缩功能转化的热量为q1&#xff0c;高温高压的气态冷媒与水进行热交换&#xff0c;高压的冷媒在常温下被冷却、冷凝为液态。这过程中&#xff0c;冷媒放出热量用来加热水&#xff0c;使水升温变…

机器学习数学公式推导之降维

文章目录 降维线性降维-主成分分析 PCA损失函数SVD 与 PCoASVD 的基本形式SVD 的计算p-PCA 小结 P22 (系列五) 降维1-背景 本文参考 B站UP: shuhuai008 &#x1f339;&#x1f339; 降维 我们知道&#xff0c;解决过拟合的问题除了正则化和添加数据之外&#xff0c;降维就是最…

数据链路层与ARP协议

一.认识识以太网 "以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内 容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等; 以太网中的网线必须使用双绞线; 传输速率有 10M, 100M, 1000M 等; 以太网是当前应用…

【最新华为OD机试E卷-支持在线评测】机器人活动区域(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,…

2024年【金属非金属矿山(露天矿山)安全管理人员】考试题及金属非金属矿山(露天矿山)安全管理人员最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 金属非金属矿山&#xff08;露天矿山&#xff09;安全管理人员考试题参考答案及金属非金属矿山&#xff08;露天矿山&#xff09;安全管理人员考试试题解析是安全生产模拟考试一点通题库老师及金属非金属矿山&#xf…

Java魔板游戏软件(含代码)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【第0007页 · 数组】数组中重复的数据(如何实现数组的原地修改)

【前言】本文以及之后的一些题解都会陆续整理到目录中&#xff0c;若想了解全部题解整理&#xff0c;请看这里&#xff1a; 第0007页 数组中重复的数据 今天&#xff0c;我们来看一个在实际工作中运用不多&#xff0c;但是对于一些算法题还是有必要的奇技淫巧——数组的原地修…

基于开源链动 2 + 1 模式、AI 智能名片与 S2B2C 商城小程序的用户忠诚度计划

摘要&#xff1a;本文深入探讨了在商业环境中执行用户忠诚度计划的创新途径。通过整合开源链动 2 1 模式、AI 智能名片以及 S2B2C 商城小程序等先进元素&#xff0c;从提供福利、解决问题和创造赚钱机会三个核心方面展开详细阐述。研究表明&#xff0c;这些新技术和新模式的有…

LLM大模型:将爬虫与大语言模型结合

摘要 Web自动化是一种重要技术&#xff0c;通过自动化常见的Web操作来完成复杂的Web任务&#xff0c;可以提高运营效率并减少手动操作的需要。 传统的实现方式&#xff0c;比如包装器&#xff0c;当面对新的网站时&#xff0c;面临着适应性和可扩展性的限制。 另一方面&…

国内短剧系统怎么搭建以及都需要那些资质?

聊到国内短剧&#xff0c;相信大家都不陌生&#xff0c;在各大短视频平台可谓是火的一批&#xff0c;您或许有想加入进来的想法&#xff0c;或是已经有规划还未实现的&#xff0c;请停下脚步&#xff0c;耐心看完该文章&#xff0c;相信一定会对你有所帮助的。本文介绍短剧平台…

C语言中结构体struct和联合体union的区别

C语言 文章目录 C语言前言一、什么是结构体二、什么是联合体三、结构体和联合体的区别 前言 一、什么是结构体 在C语言中&#xff0c;结构体指的是一种数据结构&#xff0c;是C语言中聚合数据类型的一类。结构体可以被声明为变量、指针或数组等&#xff0c;用以实现较复杂的数…

单调栈的实现

这是C算法基础-数据结构专栏的第二十四篇文章&#xff0c;专栏详情请见此处。 引入 单调栈就是满足单调性的栈结构&#xff0c;它最经典的应用就是给定一个序列&#xff0c;找出每个数左边离它最近的比它大/小的数。 下面我们就来讲单调栈的实现。 定义 单调栈就是满足单调性…

SnapGene 5.3.1下载安装教程百度网盘分享链接地址

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 SnapGene介绍 SnapGene 5.3.1下载安装教程百度网盘分享链接地址&#xff0c;SnapGene 是一款由美国公司开发&#xff08;后被收购&#xff09;的分子生物学软件&#xff0c;…

Deepspeed框架学习笔记

DeepSpeed 是由 Microsoft 开发的深度学习优化库,与PyTorch/TensorFlow等这种通用的深度学习框架不同的是,它是一个专门用于优化和加速大规模深度学习训练的工具,尤其是在处理大模型和分布式训练时表现出色。它不是一个独立的深度学习框架,而是依赖 PyTorch 等框架,扩展了…

Vue 向标签中传入 this

我曾经问过 chatgpt 这个问题&#xff0c;chatgpt 说不行&#xff01; 但是&#xff0c;chatgpt 说的就算吗&#xff1f; 来试试吧&#xff1a; https://andi.cn/page/621733.html 当然是可以的&#xff01;

apk反编译修改教程系列-----修改apk 解除软件限制功能 实例操作步骤解析_6【二十五】

目前很多软件都需要票票才可以使用完全的功能。纯免费的功能性app已经很少见了。 今天继续以一款app为大家来演示如何去除软件的限制功能。教程的目的主要是学习反编译的基础修改方法,了解app的修改步骤以及基础的入门修改常识。每个使用修改方法不一定适用于所有app。只是给你…

springboot、flowable 生成图片发布到Docker乱码问题

flowable自带的方法生成图片时&#xff0c;如设置字体为宋体&#xff0c;则本地测试没有问题&#xff0c;因为windows自带宋体字体库&#xff0c;但是如果发布到Docker&#xff0c;则会出现乱码问题&#xff0c;因为大部分Docker并不包含宋体字体库&#xff1b; 通过Java代码&a…

AAudio的延迟优化

AAudio | Android NDK | Android Developers