[程序员代码面试指南]数组和矩阵问题-数组排序后相邻数的最大差值(桶排序思想)

题意

给定一个整形数组arr,返回排序后的相邻两数的最大差值。

题解

  • 借助桶排序思想。

    • 首先遍历一遍获得最大值max,最小值min。
    • 设数组长度为len,则有len+1个桶,桶负责的区间大小是(max-min)/len,数字num放入的桶id是(num-min)/((max-min)/len)即(num-min)*len/(max-min)。
    • 由于min在桶0,max在桶len+1,所以一定隔了至少一个空桶。所以“排序后的相邻两数的最大差值”一定是相邻的两个非空桶的(区间存较大数的桶)最小值-(区间存较小数的桶)最大值,而不会在同一桶内。
  • 时间复杂度为O(N)。

    代码

public class Main {
    public static void main(String args[]) {
        int[] arr= {9,3,1,10};
        int maxGap=getMaxGap(arr);
        System.out.println(maxGap);
    }

    public static int getMaxGap(int[] arr) {
        if(arr.length<2) {
            return 0;
        }
        int[] maxs=new int[arr.length+1];
        int[] mins=new int[arr.length+1];
        boolean[] hasElm=new boolean[arr.length+1];

        int max=Integer.MIN_VALUE;
        int min=Integer.MAX_VALUE;
        for(int i=0;i<arr.length;++i) {
            max=arr[i]>max?arr[i]:max;
            min=arr[i]<min?arr[i]:min;
        }
        if(max==min) {
            return 0;
        }

        for(int i=0;i<arr.length;++i) {
            int bId=getBId(arr[i],arr.length,min,max);
            maxs[bId]=hasElm[bId]?Math.max(arr[i], maxs[bId]):arr[i];//
            mins[bId]=hasElm[bId]?Math.min(arr[i], mins[bId]):arr[i];//
            hasElm[bId]=true;//
        }

        int preMax=maxs[0];
        int maxGap=0;
        for(int i=1;i<arr.length+1;++i) {
            if(hasElm[i]) {
                maxGap=mins[i]-preMax>maxGap?mins[i]-preMax:maxGap;
                preMax=maxs[i];
            }
        }
        return maxGap;
    }

    public static int getBId(long num,long len,long min,long max) {
        return (int)((num-min)*len/(max-min));
    }
}

原文地址:https://www.cnblogs.com/coding-gaga/p/10947149.html

时间: 2024-10-06 23:24:33

[程序员代码面试指南]数组和矩阵问题-数组排序后相邻数的最大差值(桶排序思想)的相关文章

[程序员代码面试指南]数组和矩阵问题-找到无序数组中最小的k个数(堆排序)

题目链接 https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=13&tqId=11182&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 从无序序列,找到最小topk个元素. 解题思路 使用大根堆维护最小topk个元素: - 首先前k个元素建立大根堆(从

[程序员代码面试指南]数组和矩阵问题-未排序正数数组中累加和为给定值的最长子数组长度

题目描述 给定无序数组,每个值均为正数,再给定整数k.求arr中所有子数组中所有元素相加和为k的最长子数组长度.无则输出-1. 例: 输入 arr=[1,2,1,1,1],k=3 输出 3 解题思路 (时间复杂度O(N),空间复杂度O(1)) 维护指针l,r表示子数组区间.初始l=r=0,向右移动至r=arr.length结束. 维护当前子数组和sum,及到当前为止满足题意的最大len.初始sum=arr[0],len=-1. 每次比较sum和k,根据情况选择移动l还是r,并更新sum和len.

[程序员代码面试指南]数组和矩阵问题-数组中子数组的最大累乘积

问题描述 给定数组,输出所有子数组的累积的最大值. 题解 以arr[i]结尾的最大累乘积=max{maxarr[i],minarr[i],arr[i]},其中max.mini表示以arr[i-1]结尾的最大累乘积.最小累乘积. 最后再取一个最大值即可. 时间复杂度O(n) 代码 public class Main { public static void main(String args[]) { int[] arr= {-2,4,0,3,5,8,-1}; int maxProduct=getM

[程序员代码面试指南]数组和矩阵-数组的partition调整

题目 补充问题:数组只含0,1,2,对数组排序,要求时间复杂度O(n),额外空间复杂度O(1) 题解 维护三个变量,l,idx,r.左区间[0,l],中间区间[l+1,idx],右区间[idx+1,r]. 初始化l=-1,r=len,idx=0.idx用来遍历数组. 当arr[idx]=1,idx++; 当arr[idx]=0,swap(arr[l+1,idx]),i++,idx++ 当arr[idx]=2,swap(arr[idx,r-1]),r--,idx++ 当idx=r说明中区间和右区间

[程序员代码面试指南]递归和动态规划-换钱的最少货币数

题目描述 给定arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的最少货币数. 解题思路 dp[i][j]表示只用第0到i种货币,凑成j元的最小货币张数. 初始化: 转移方程: dp[i][j]=min{dp[i-1][j-k*arr[i]]+k} (k>=0) 整理得 dp[i][j]=min{dp[i-1][j],min{dp[i-1][j-k*arr[i]]+k}} (k>=1) 变换得 dp[i][j]=

程序员代码面试指南 IT名企算法与数据结构题目最优解 ,左程云著pdf高清版免费下载

下载地址:网盘下载 备用地址:网盘下载 内容简介  · · · · · ·这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮助广大程序员的面试准备做到万无一失.“刷”完本书后,你就是“题王”!__eol__本书采用题目+解答的方式组织内容,并把面试题类型相近或者解法相近的题目尽量放在一起,读者在学习本书时很容易看出面试题解法之间的联系,使知识的学习避免碎片化

[程序员代码面试指南]二叉树问题-找到二叉树中两节点最近公共祖先

题解 法一:后序遍历.搞清返回值逻辑. todo 更新别的方法 法一代码 public class Parent { public static void main(String args[]) { Node n1=new Node(1); Node n2=new Node(2); Node n3=new Node(3); Node n4=new Node(4); n1.left=n2; n1.right=n3; n3.left=n4; System.out.print(firstParent(

《程序员代码面试指南》第八章 数组和矩阵问题 将正方形矩阵顺时针转动90

题目 将正方形矩阵顺时针转动90 java代码 package com.lizhouwei.chapter8; /** * @Description: 将正方形矩阵顺时针转动90 * @Author: lizhouwei * @CreateDate: 2018/4/28 22:16 * @Modify by: * @ModifyDate: */ public class Chapter8_2 { public void rotate(int[][] matrix) { int tR = 0; i

《程序员代码面试指南》第八章 数组和矩阵问题 &quot;之&quot;字形打印矩阵

题目 "之"字形打印矩阵 java代码 package com.lizhouwei.chapter8; /** * @Description: "之"字形打印矩阵 * @Author: lizhouwei * @CreateDate: 2018/4/28 22:53 * @Modify by: * @ModifyDate: */ public class Chapter8_3 { public void printMatrixZigZag(int[][] matri