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


    题意

    给定一个整形数组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));
    	}
    }
    
  • 相关阅读:
    Linux ps 命令获取查询结果中的单列信息
    nowcoder(牛客网)普及组模拟赛第一场 解题报告
    Subway Pursuit (二分)(交互题)
    nowcoder(牛客网)OI测试赛2 解题报告
    NOIP提高组题目归类+题解摘要(2008-2017)
    CYJian的水题大赛2 解题报告
    数独问题
    题解 UVA11300 【Spreading the Wealth】
    实验吧web题:
    简单的sql语句
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/10947149.html
Copyright © 2020-2023  润新知