排序练习题(六):相邻两数最大差值

有一个整形数组A,请设计一个复杂度为O(n)的算法,算出排序后相邻两数的最大差值。

给定一个int数组AA的大小n,请返回最大的差值。保证数组元素多于1个。

测试样例:

[1,2,5,4,6],5
返回:2
public class Gap {
    public int maxGap(int[] A, int n) {
        // write code here
        if(null == A ||n<2) return 0;
        int min=Integer.MAX_VALUE;
        int max=Integer.MIN_VALUE;
        for(int i=0;i<n;i++){
            if(A[i]>max) max=A[i];
            if(A[i]<min) min=A[i];
        }
        if(min==max) return 0;
        boolean[] hasNum =new boolean[n+1];
        int[]maxs=new int[n+1];
        int[] mins=new int[n+1];
        for(int i=0;i<n;i++){
            int bid=bucket(A[i],n,min,max);
            maxs[bid]=hasNum[bid]?Math.max(maxs[bid],A[i]):A[i];
            mins[bid]=hasNum[bid]?Math.min(mins[bid],A[i]):A[i];
            hasNum[bid]=true;
        }
        int res=0;
        int lastMax=0;
        int i=0;
        while(i<=n){
            if(hasNum[i++]){
                lastMax = maxs[i-1];
                break;
            }
        }
        for(;i<=n;i++){
            if(hasNum[i]){
                res=Math.max(res,mins[i]-lastMax);
                lastMax=maxs[i];
            }
        }
        return res;

    }
    public int bucket(long num,long length,long min,long max){
        return (int)((num-min)*length/(max-min));
    }
}

  

时间: 2024-08-10 23:30:15

排序练习题(六):相邻两数最大差值的相关文章

第2章 排序 || 第20节 相邻两数最大差值练习题

题目 有一个整形数组A,请设计一个复杂度为O(n)的算法,算出排序后相邻两数的最大差值. 给定一个int数组A和A的大小n,请返回最大的差值.保证数组元素多于1个. 测试样例: [1,2,5,4,6],5 返回:2 解析: // 第20节 相邻两数最大差值练习题 // 基于桶排序的思想完成,不考虑两个相同的桶内的差值,只考虑该桶的最小值减去上一个桶的最大值,最大的就是最大值. class Gap { public: int maxGap(vector<int> A, int n) { // w

算法--相邻两数最大差值

相邻两数最大差值 代码实现 1 package com.hzf.sort; 2 3 import org.junit.Test; 4 5 /** 6 * 有一个整形数组A,请设计一个复杂度为O(n)的算法,算出排序后相邻两数的最大差值. 7 * 8 * 给定一个int数组A和A的大小n,请返回最大的差值.保证数组元素多于1个. 9 * 10 * 测试样例: [1,2,5,4,6],5 11 * 返回:2 12 * 13 * @author hzf 14 * 15 */ 16 public cla

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

思路: 桶排序 N个数,设置 N+ 1 个桶,,一定有一个空桶,,为的是保证最大差值一定是不是出现在同一个桶中: 只要比较 非空桶 的最小值,与前一个 非空桶的最大值,求 最大的差值, 1 package my_basic; 2 3 import java.text.Bidi; 4 import java.util.Arrays; 5 6 public class MaxGap { 7 8 /*给定一个数组,求如果排序之后,相邻两数的最大差值,要求时 间复杂度O(N),且要求不能用非基于比较的排

给定一个数组,求如果排序后,相邻两个元素的最大差值,要求时间复杂度为O(N)

第一种方法: 计数排序后,然后找出两两之间的最大差值 计数排序的时间复杂度是O(N) public class CountSort { public static void main(String[] args) { int[] arr = new int[] { 2, 5, 12, 8, 6, 90, 34, 10, 10 }; sort(arr); Arrays.stream(arr).forEach(x -> System.out.print(x + " ")); //计算

【算法】—— 相邻两数的最大差值

题目: 思路: 如果数组长度为N,考虑使用N+1个桶,每个桶能放入数的范围固定,将数组中数据依次放入桶中,那么肯定有一个桶是空桶(因为数一共有N个,而桶有N+1个). 最大差值就出现在相邻两个不为空的桶之间,具体为当前铜的最小值减去前一个桶的最大值. 需要注意的是:如何对于每个数,计算它应该放入的桶号. public static int bucket(long num, long len, long min, long max) { return (int) ((num - min) * le

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

题意 给定一个整形数组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,所以一定隔了至少一个空桶.所以"排序后的相邻两数的最大差值"一定是相邻的两个非空桶的(区间存较大数的桶)

[算法]数组排序之后相邻数的最大差值

题目: 给定一个整形数组arr,返回排序后的相邻两数的最大差值. 时间复杂度为O(N). 解答: 如果用排序法实现,其时间复杂度为O(NlogN),而如果利用桶排序的思想(不是桶排序),可以做到O(N),额外空间复杂度为O(N).遍历arr找到最大值max和最小值min.如果arr的长度为N,准备N+1个桶,把max单独放在第N+1个桶中,[min,max)范围上的数放在1~N号桶里,对于1~N号桶中的每一个桶来说,负责的区间为(max-min)/N.如果一个数为num,它应该分配进(num-m

[LintCode/LeetCode]——两数和、三数和、四数和

LintCode有大部分题目来自LeetCode,但LeetCode比较卡,下面以LintCode为平台,简单介绍我AC的几个题目,并由此引出一些算法基础. 1)两数之和(two-sum) 题目编号:56,链接:http://www.lintcode.com/zh-cn/problem/two-sum/ 题目描述: 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 1

相邻最大差值

题目描述 请设计一个复杂度为O(n)的算法,计算一个未排序数组中排序后相邻元素的最大差值. 给定一个整数数组A和数组的大小n,请返回最大差值.保证数组元素个数大于等于2小于等于500. 测试样例: [9,3,1,10],4 返回:6 Solution 1: class MaxDivision { public: int findMaxDivision(vector<int> A, int n) { // write code here sort(A.begin(), A.end()); int