返回顶部
首页 > 资讯 > 后端开发 > Python >Java解决计算相邻两个数的最大差值的问题
  • 211
分享到

Java解决计算相邻两个数的最大差值的问题

2024-04-02 19:04:59 211人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

hello,今天给大家带来一道算法题。这道算法题,是我目前为止,见过最难的一道题。那么到底是怎样的一道算法题呢?如下: 题目:给定一个数组, 求如果排序之后, 相邻两数的最大差值。

hello,今天给大家带来一道算法题。这道算法题,是我目前为止,见过最难的一道题。那么到底是怎样的一道算法题呢?如下:

题目:给定一个数组, 求如果排序之后, 相邻两数的最大差值。 要求时间复杂度O(N), 且要求不能用非基于比较的排序。

我查了一下,暂时没有找到一个在线OJ的链接,只能自己写一个对数器,手动测试了。

当初我看到这个题目的时候,说这怎么可能呢?在一个无序的数组中,求相邻两个数据的最大差值。可是我们都知道,现在基于比较的排序算法,最快也只能够达到O(N*logN)的水平,而题目明确限制时间复杂度要是O(N),所以想通过基于比较的排序,排序之后再进行遍历,时间复杂度肯定是达不到要求的。

有人可能也会想说,不是还有基于非比较的排序算法吗?比如计数排序、基数排序、桶排序。但是题目又明确规定了不能使用基于非比较的排序算法。

这样的话,想使用排序算法,进行排序,这条路肯定是行不通的。只能另外想其他的办法。

-------------------------------------------------------------------------------------------我是分割线-----------------------------------------------------------------------------------------

重头戏来了!!!整个代码的流程如下:

1.先遍历一遍数组,保存整个数组的最大值和最小值。

2.假设数组中一共有N个元素,那么我们就需要准备N+1个桶。

这每一个桶里面,可以存储一定范围内的数值,而具体可以存储多大范围内的数值,需要用公式去计算。比如:第一个桶存储0……9之间的数,第二个桶存储10……19的数……

3.我们再次遍历一遍数组,将每一个数,放入到相应的桶里。

解释:为什么需要进行以上这3个步骤???这是一个非常值得思考的问题!!!

由题可知,一共有N个数,但是我们准备了N+1个桶。也就是说我们将每个数放入相应的桶中,就算这N个数都在各自的桶里,无论怎么放入,始终会多出来1个空桶。

而我们会根据一下这个公式,将每个数放入相应的桶:(arr[i]- min)* N / (max - min)。

以上这个公式,就能够计算出i位置的数,应该放入哪一个桶里。根据公式计算,最小值一定会放到第一个桶里,最大值也一定会放到最后一个桶里。那么既然第一个和最后一个桶肯定是有数据的,也就是说明那个空桶肯定是中间的某一个桶。

正是因为这个空桶的存在,会将很多种计算的可能性直接抹杀掉。说的具体点,假设一个桶的存储数的范围是0~9,也就是这个桶能够存储10个数,既然有一个空桶的话,那么肯定最后的答案是大于10的。

那么既然大于10的话,这两个数肯定不会在同一个桶里。这样的话,我们就排除了桶里面两个数据的情况,只需要考虑相邻两个桶之间的数,才可能是最终的答案。

就如上图的形式,将所有的数据都放入相应的桶里。因为有空桶的存在,所以我们的答案必然是在两个不同桶之间的数据进行相减。而我们在进行相减的时候,只需要记录每个桶的最大值和最小值即可。也就是说,用后一个桶的最小值,减前一个桶的最大值。以这样的形式,循环N次,将每两个相邻的桶进行计算,就能得到最终的答案。

既然我们只需要每个桶里的最大值和最小值,那就准备两个数组maxs和mins,分别存储即可。代码如下:

以上就是这道题的所有代码,代码不多,但是其中的算法思想我觉得真的是很厉害,很难想象出,想到这个方法的是什么人。

核心就在于那个空桶的存在,抹杀很多的可能性。使其最终的答案只可能存在于相邻两个桶之间的数。

提问:假设给定的某一个数组,算出来桶的数据后,只有一个是空桶。那么最终的答案就一定是这个空桶右边桶的数据减去左边桶的数据吗?

最后,我将整个代码全部放到下面,包括了一个对数器,用于测试以上代码的正确性。


import java.util.Arrays;

public class Code01_CalcTwoNumDiv {
    public static void main(String[] args) {
        int testTime = 5000; //测试次数
        int N = 50; //数组长度
        int range = 1000; //数据范围
        boolean flag = true;
        for (int i = 0; i < testTime; i++) {
            int[] arr = generateArr(N, range);
            int p1 = calcTwoNumDiv(arr);
            int p2 = sortAfter(arr);
            if (p1 != p2) {
                flag = false;
                break;
            }
        }
        System.out.println(flag? "正确" : "错误");
    }

    public static int calcTwoNumDiv(int[] array) {
        if (array == null || array.length < 2) {
            return 0;
        }
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        for (int i : array) { //先遍历一遍数组,求最大值最小值
            max = Math.max(max, i);
            min = Math.min(min, i);
        }
        if (max == min) {
            return 0; //如果最大值和最小值相等,说明这个数组只有这一个数据
        }
        int len = array.length;
        boolean[] hasNum = new boolean[len + 1];
        int[] maxs = new int[len + 1];
        int[] mins = new int[len + 1];
        //遍历数据
        for (int i = 0; i < array.length; i++) {
            int bit = getBit(array[i], len, max, min); //桶的位置
            maxs[bit] = hasNum[bit] ? Math.max(maxs[bit], array[i]) : array[i]; //更新最大值
            mins[bit] = hasNum[bit] ? Math.min(mins[bit], array[i]) : array[i]; //更新最小值
            hasNum[bit] = true; //始终更新为true
        }

        //第一个桶和最后一个桶,肯定是有数据的。
        int preMax = maxs[0];
        int res = Integer.MIN_VALUE; //最终的结果
        for (int i = 1; i <= len; i++) {
            if (hasNum[i]) {
                res = Math.max(res, mins[i] - preMax);
                preMax = maxs[i]; //更新前一个的最大值
            }
        }
        return res;
    }

    public static int getBit(int num, int len, int max, int min) {
        return ((num - min) * len) / (max - min); //计算num应该存储在哪个桶
    }

    public static int sortAfter(int[] arr) {
        if (arr == null || arr.length < 2) {
            return 0;
        }

        Arrays.sort(arr);
        int res = Integer.MIN_VALUE;
        for (int i = 1; i < arr.length; i++) {
            res = Math.max(res, arr[i] - arr[i - 1]);
        }
        return res;
    }

    public static int[] generateArr(int N , int range) {
        int[] arr = new int[N];
        for (int i = 0; i < N; i++) {
            arr[i] = (int)(Math.random() * range);
        }
        return arr;
    }
}

到此这篇关于Java解决计算相邻两个数的最大差值的问题的文章就介绍到这了,更多相关Java 计算相邻数的最大差值内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java解决计算相邻两个数的最大差值的问题

本文链接: https://lsjlt.com/news/159673.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java解决计算相邻两个数的最大差值的问题
    hello,今天给大家带来一道算法题。这道算法题,是我目前为止,见过最难的一道题。那么到底是怎样的一道算法题呢?如下: 题目:给定一个数组, 求如果排序之后, 相邻两数的最大差值。 ...
    99+
    2024-04-02
  • Java如何解决计算相邻两个数的最大差值的问题
    这篇文章主要介绍Java如何解决计算相邻两个数的最大差值的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!题目:给定一个数组, 求如果排序之后, 相邻两数的最大差值。 要求时间复杂度O(N), 且要求不能用非基于比...
    99+
    2023-06-25
  • MySQL计算相邻两行某列差值的方法
    这篇文章给大家分享的是有关MySQL计算相邻两行某列差值的方法的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。MySQL计算相邻两行某列差值的方法:首先通过【r1.rownum =...
    99+
    2024-04-02
  • 怎么在Mysql中计算相邻两行记录某列的差值
    本篇文章给大家分享的是有关怎么在Mysql中计算相邻两行记录某列的差值,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。表结构:数据:需求:按照c...
    99+
    2024-04-02
  • PHP计算两个日期相差的天数方法详解
    function diff_date($date1, $date2){ if($date1>$date2){ $startTime = strtotime($date1); $endTime = strtotime...
    99+
    2023-09-06
    php 开发语言
  • oracle怎么计算两个日期相差的天数
    要计算两个日期之间的天数差异,可以使用Oracle数据库中的DATEDIFF函数。该函数接受两个日期作为参数,并返回这两个日期之间的...
    99+
    2024-04-09
    oracle
  • MySQL计算两个日期相差的天数、月数、年数
    MySQL自带的日期函数TIMESTAMPDIFF计算两个日期相差的秒数、分钟数、小时数、天数、周数、季度数、月数、年数,当前日期增加或者减少一天、一周等等。 SELECT TIMESTAMPDIFF(...
    99+
    2024-04-02
  • java计算两个日期之间相差的天数的四种方法
    计算两个日期之间相差的天数的四种方法 第一种:时间戳的方式,计算两个日期的时间戳的差,再除当天的毫秒数即可得到相差的天数。 public static void main(String[] args) {DateFormat dft = n...
    99+
    2023-08-17
    java 开发语言
  • MySQL用TIMESTAMPDIFF计算两个日期的月份差问题
    在MySQL中,可以使用TIMESTAMPDIFF函数来计算两个日期之间的月份差。语法如下:```TIMESTAMPDIFF(uni...
    99+
    2023-09-21
    MySQL
  • Python计算两个日期相差天数的方法示例
    本文实例讲述了Python计算两个日期相差天数的方法。分享给大家供大家参考,具体如下: #!/usr/bin/python import time import sys def dateinput():...
    99+
    2022-06-04
    天数 示例 两个
  • 如何解决js数字计算误差的问题
    这篇文章主要为大家展示了“如何解决js数字计算误差的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决js数字计算误差的问题”这篇文章吧。实例如下://...
    99+
    2024-04-02
  • Java计算两个时间段的差的实例详解
    在本文中,让我们探索各种方法来找出 Java 中两个时间段之间的差异。为简单起见,假设提供给我们的时间段格式为 HH:MM:SS 例子 输入:第一个时间段:- 18:00:00 ...
    99+
    2022-11-13
    Java 计算时间段差
  • MSSQL中怎么计算两个日期相差的工作天数
    MSSQL中怎么计算两个日期相差的工作天数,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。代码如下: if exists (s...
    99+
    2024-04-02
  • Python实现计算两个时间之间相差天数的方法
    本文实例讲述了Python实现计算两个时间之间相差天数的方法。分享给大家供大家参考,具体如下: #-*- encoding:UTF-8 -*- from datetime import date imp...
    99+
    2022-06-04
    天数 两个 时间
  • 使用java怎么计算数组的最大值
    本篇文章给大家分享的是有关使用java怎么计算数组的最大值,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、We...
    99+
    2023-06-14
  • MySQL 计算两个日期/时间之间相差的天数、分钟数、秒数...
    MySQL 中经常遇到计算两个日期或者时间之间相差的天数、周数、小时数、分钟、秒等等,下面分享一个MySQL内置的函数:TimeStampDiff() 这个函数是MySQL本身提供的可以计算两个时间间隔的函数。 语法: TIMESTAMPD...
    99+
    2023-08-16
    mysql 数据库
  • 利用java怎么求出两个数中的最大值
    利用java怎么求出两个数中的最大值?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。java中的max函数在Math中应用如下:int a=34;int b=45...
    99+
    2023-05-31
    java ava
  • pandas计算相关系数corr返回空的问题解决
    目录解决方法问题复现解决方法 查看dataframe的数据类型,转为数值类型即可: dataframe = dataframe.astype("float") 或者逐列转换: for...
    99+
    2023-01-17
    pandas corr返回空 pandas corr返回
  • c语言怎么计算两个正整数的最大公约数
    #include <stdio.h> // 计算两个正整数的最大公约数 int gcd(int a, int b) {...
    99+
    2024-03-04
    c语言
  • 如何解决java获取时间相差8小时的问题
    目录三种时间差错问题: 原因: 解决方案: 总结:都是时区问题三种时间差错问题: java下使用new date()获取的时间会和真实的本地时间相差8小时。 本地...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作