leetcode刷题笔记一百六十四题 最大间距

leetcode刷题笔记一百六十四题 最大间距

源地址:164. 最大间距

问题描述:

给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。

如果数组元素个数小于 2,则返回 0。

示例 1:

输入: [3,6,9,1]
输出: 3
解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。
示例 2:

输入: [10]
输出: 0
解释: 数组元素个数小于 2,因此返回 0。
说明:

你可以假设数组中所有元素都是非负整数,且数值在 32 位有符号整数范围内。
请尝试在线性时间复杂度和空间复杂度的条件下解决此问题

//常规思路 是对数组进行排序 而后对前后计算间隔值 返回最大值
object Solution {
    def maximumGap(nums: Array[Int]): Int = {
        val sortedNum = nums.sorted
        val length = nums.length
        if (length < 2) return 0 
        var max = 0
        for (i <- 1 to length-1) max = Math.max(max, sortedNum(i) - sortedNum(i-1))
        return max
    }
}

//线性时间复杂度与空间复杂度 需要使用桶排序
object Solution {  
    def maximumGap(nums: Array[Int]): Int = {
        if (nums == null || nums.length < 2) return 0
        
        //建桶过程 需要获取最大值 最小值
        val max = nums.max
        val min = nums.min
        
        //这里 +1 或者 不加是对桶排序开闭区间的选择
        //举例而言 [2, 4, 6, 8]
        //开区间的情况[2, 4) [4, 6) [6, 8)
        //故 +1 可以把8放入桶中
        val bucketSize = (max - min)/nums.length + 1
        
        val bucketMin = Array.fill(nums.length)(Int.MaxValue)
        val bucketMax = Array.fill(nums.length)(Int.MinValue)
        //将num放入桶中, 更新桶内的min值与max值
        for (num <- nums){
            val loc = (num - min)/bucketSize
            bucketMin(loc) = Math.min(bucketMin(loc), num)
            bucketMax(loc) = Math.max(bucketMax(loc), num)
        }
        
        //获取间距
        var res = Int.MinValue
        var prev = Int.MaxValue
        //如果桶内num差距过大,且nums.length较小 可能分出过多不使用的桶,需要进行过滤
        for (i <- 0 to nums.length - 1 if bucketMax(i) != Int.MinValue){
            //prev 前一个桶内有数,计算桶间差距
            if (prev != Int.MaxValue) res = Math.max(res, bucketMin(i) - prev)
            //计算新的桶右边界
            prev = bucketMax(i)
            //计算桶内差距
            res = Math.max(res, bucketMax(i) - bucketMin(i))
        }
        
        return res
    }
}
原文地址:https://www.cnblogs.com/ganshuoos/p/13615870.html