• 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
        }
    }
    
  • 相关阅读:
    流行的编程思维_面向对象-1
    db_Driver Manager
    SpringAOP
    Spring ioc的核心源码及拓展
    linux内核中把自己写的驱动添加到make menuconfig
    如何参考am335x ti官方技术
    AM335X linux嵌入式平台can驱动移植
    linux AM335x嵌入式平台spi驱动调试
    linux 设备树 gpio获取
    linux 为开发板添加板级文件config.h
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13615870.html
Copyright © 2020-2023  润新知