套路笔记-桶排序
Posted 陌上发花缓缓醉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了套路笔记-桶排序相关的知识,希望对你有一定的参考价值。
164. Maximum Gap 求最大间距
给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。
如果数组元素个数小于 2,则返回 0。
示例
输入: [3,6,9,1]
输出: 3
输入: [10]
输出: 0
解题思路:
利用 桶排序的方法,将 n 个数 放入 n 个桶中,如果这 n 个数是均匀分布的,那么每个桶中有且仅有一个元素,并且各个元素之间的距离也都几乎相等,最大的间距发生在桶与桶之间。如果打破了这种平衡,某个元素进入了另外的一个桶,那么必定有一个桶是空的,这个空桶前后两个桶之间的元素间距大于桶的容量,最大的间距就在这里产生。
综上:最大的间距是出现在两个有数据桶的前后边界
解题步骤:
第一个桶和最后一个桶一定有值!
1. 确定每个桶的容量大小 Gap 2. 记录每个桶内的边界值 3. 计算,桶之间的Gap 大小 并记录最大值
python 版本:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
class Solution(object):
def maximumGap(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums) < 2:
return 0
max = nums[0]
min = nums[0]
#获取最大最小值
for n in nums:
max = n if n > max else max
min = n if n < min else min
# 获取平均间距 向上取整
gap = (max - min) / len(nums) + 1
# 初始化 所有的桶
bucktList = [{} for i in nums]
for n in nums:
# 将每个元素放入对应的桶中
idx = int((n - min) / gap)
# 每个桶只存放最大值 最小值
bucktMin = bucktList[idx].get("min")
if bucktMin == None or bucktMin > n:
bucktList[idx]["min"] = n
bucktMax = bucktList[idx].get("max")
if bucktMax == None or bucktMin < n:
bucktList[idx]["max"] = n
# 第一个桶和最后一个桶 一定有值,
# 因为获取间距的时候是根据最前最后两个点获取
preMax = bucktList[0].get("max")
maxGap = bucktList[0].get("max") - bucktList[0].get("min")
for idx in range(1, len(bucktList)):
# 取当前桶的最小值和 前一个最大值的 间距
curBucktMin = bucktList[idx].get("min")
maxGap = curBucktMin - preMax if curBucktMin != None and (curBucktMin - preMax) > maxGap else maxGap
curBucktMax = bucktList[idx].get("max")
preMax = curBucktMax if curBucktMin != None else preMax
return maxGap
if __name__ == "__main__":
t = Solution()
print(t.maximumGap([1, 22, 100]))
golang:
func maximumGap(nums []int) int {
if len(nums) < 2 {
return 0
}
max, min, gap := nums[0], nums[0], 0
for _, v := range nums {
if v > max {
max = v
}
if v < min {
min = v
}
}
gap = (max-min)/len(nums) + 1
if gap == 0 {
return 0
}
type bucket struct {
hasMaxValue bool
hasMinValue bool
max int
min int
}
bucketArr := make([]bucket, len(nums), len(nums))
for _, v := range nums {
//分布在那个桶中
idx := (v - min) / gap
if bucketArr[idx].max <= v || !bucketArr[idx].hasMaxValue {
bucketArr[idx].max = v
bucketArr[idx].hasMaxValue = true
}
if bucketArr[idx].min >= v || !bucketArr[idx].hasMinValue {
bucketArr[idx].min = v
bucketArr[idx].hasMinValue = true
}
}
maxGap := bucketArr[0].max - bucketArr[0].min
preMax := bucketArr[0].max
for i := 1; i < len(bucketArr); i++ {
if bucketArr[i].hasMinValue {
tmpGap := bucketArr[i].min - preMax
if tmpGap > maxGap {
maxGap = tmpGap
}
preMax = bucketArr[i].max
}
}
return maxGap
}
相关链接:
以上是关于套路笔记-桶排序的主要内容,如果未能解决你的问题,请参考以下文章