套路笔记-桶排序

Posted 陌上发花缓缓醉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了套路笔记-桶排序相关的知识,希望对你有一定的参考价值。



164. Maximum Gap 求最大间距

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

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

示例

  
    
    
  
  1. 输入: [3,6,9,1]

  2. 输出: 3

  
    
    
  
  1. 输入: [10]

  2. 输出: 0

解题思路:

    利用 桶排序的方法,将 n 个数 放入 n 个桶中,如果这 n 个数是均匀分布的,那么每个桶中有且仅有一个元素,并且各个元素之间的距离也都几乎相等,最大的间距发生在桶与桶之间。如果打破了这种平衡,某个元素进入了另外的一个桶,那么必定有一个桶是空的,这个空桶前后两个桶之间的元素间距大于桶的容量,最大的间距就在这里产生。

综上:最大的间距是出现在两个有数据桶的前后边界


解题步骤:

第一个桶和最后一个桶一定有值!

1. 确定每个桶的容量大小 Gap 2. 记录每个桶内的边界值 3. 计算,桶之间的Gap 大小 并记录最大值


python 版本:

 
   
   
 
  1. #! /usr/bin/env python

  2. # -*- coding: utf-8 -*-

  3. class Solution(object):

  4. def maximumGap(self, nums):

  5. """

  6. :type nums: List[int]

  7. :rtype: int

  8. """

  9. if len(nums) < 2:

  10. return 0


  11. max = nums[0]

  12. min = nums[0]

  13. #获取最大最小值

  14. for n in nums:

  15. max = n if n > max else max

  16. min = n if n < min else min


  17. # 获取平均间距 向上取整

  18. gap = (max - min) / len(nums) + 1

  19. # 初始化 所有的桶

  20. bucktList = [{} for i in nums]


  21. for n in nums:

  22. # 将每个元素放入对应的桶中

  23. idx = int((n - min) / gap)

  24. # 每个桶只存放最大值 最小值

  25. bucktMin = bucktList[idx].get("min")

  26. if bucktMin == None or bucktMin > n:

  27. bucktList[idx]["min"] = n

  28. bucktMax = bucktList[idx].get("max")

  29. if bucktMax == None or bucktMin < n:

  30. bucktList[idx]["max"] = n


  31. # 第一个桶和最后一个桶 一定有值,

  32. # 因为获取间距的时候是根据最前最后两个点获取

  33. preMax = bucktList[0].get("max")

  34. maxGap = bucktList[0].get("max") - bucktList[0].get("min")

  35. for idx in range(1, len(bucktList)):

  36. # 取当前桶的最小值和 前一个最大值的 间距

  37. curBucktMin = bucktList[idx].get("min")

  38. maxGap = curBucktMin - preMax if curBucktMin != None and (curBucktMin - preMax) > maxGap else maxGap


  39. curBucktMax = bucktList[idx].get("max")

  40. preMax = curBucktMax if curBucktMin != None else preMax


  41. return maxGap



  42. if __name__ == "__main__":

  43. t = Solution()

  44. print(t.maximumGap([1, 22, 100]))


golang:

 
   
   
 
  1. func maximumGap(nums []int) int {

  2. if len(nums) < 2 {

  3. return 0

  4. }

  5. max, min, gap := nums[0], nums[0], 0

  6. for _, v := range nums {

  7. if v > max {

  8. max = v

  9. }

  10. if v < min {

  11. min = v

  12. }

  13. }

  14. gap = (max-min)/len(nums) + 1

  15. if gap == 0 {

  16. return 0

  17. }

  18. type bucket struct {

  19. hasMaxValue bool

  20. hasMinValue bool

  21. max int

  22. min int

  23. }

  24. bucketArr := make([]bucket, len(nums), len(nums))


  25. for _, v := range nums {

  26. //分布在那个桶中

  27. idx := (v - min) / gap

  28. if bucketArr[idx].max <= v || !bucketArr[idx].hasMaxValue {

  29. bucketArr[idx].max = v

  30. bucketArr[idx].hasMaxValue = true

  31. }

  32. if bucketArr[idx].min >= v || !bucketArr[idx].hasMinValue {

  33. bucketArr[idx].min = v

  34. bucketArr[idx].hasMinValue = true

  35. }

  36. }


  37. maxGap := bucketArr[0].max - bucketArr[0].min

  38. preMax := bucketArr[0].max

  39. for i := 1; i < len(bucketArr); i++ {

  40. if bucketArr[i].hasMinValue {

  41. tmpGap := bucketArr[i].min - preMax

  42. if tmpGap > maxGap {

  43. maxGap = tmpGap

  44. }

  45. preMax = bucketArr[i].max

  46. }

  47. }

  48. return maxGap

  49. }


相关链接:





以上是关于套路笔记-桶排序的主要内容,如果未能解决你的问题,请参考以下文章

(学习笔记)排序算法

(学习笔记)排序算法

桶排序图解与代码

桶排序和基数排序

桶排序代码

桶排序和计数排序