LeetCode第164题—最大间距—Python实现

Posted StriveZs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode第164题—最大间距—Python实现相关的知识,希望对你有一定的参考价值。


title: LeetCode No.164

categories:

  • OJ
  • LeetCode

tags:

  • Programing
  • LeetCode
  • OJ

LeetCode第164题—最大间距

各种排序我后面一定补上,大雾

自己代码的开源仓库:click here 欢迎Star和Fork 😃

题目描述

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

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

示例 1:

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

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

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

代码

#
# @lc app=leetcode.cn id=164 lang=python
#
# [164] 最大间距
#

# @lc code=start

class Solution(object):
    def time_out(self, nums):
        """
        题目要求在线性时间复杂度和空间复杂度上解决这个问题,因此最常用的排序之后在寻找最大间距大概率Time out不推荐,考虑其他方法
        [3 9 6 1] 线性复杂度的话,还是要考虑动态更新的问题,最好边排序边把最大间隔找出来,因此不仅要记录每个数字对应的最大间隔,还要找到全局最大的间隔
        那就考虑使用字典结构分别存储每个数值的最大间隔,然后每次更新最大间隔的话,
        最后更新全局最大间隔
        还有一点就是要找到线性时间排序的算法,即复杂度为o(n)
        根据网上的内容目前三种主要的线性时间排序算法分别为: 1.计数排序 2.基数排序 3.桶排序
        - 计数排序的思想: 对每一个输入元素x,确定小于x的个数,这样就可以把x直接放在它最终输出数组的位置上
        - 桶排序的思想: 将数组分到有限数量的桶子里,每个桶子在个别排序,当要被排序数组的数值是均匀分配的时候,桶排序可以是线性时间运行的
        - 基数排序的思想: 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。需要注意的是,对每一个数位进行排序的算法必须是稳定的,否则就会取消前一次排序的结果。通常我们使用计数排序或者桶排序作为基数排序的辅助算法
        
        这里我先使用插入排序来实现本问题,后续如果有时间的话,再学习一下上述三种线性时间排序
        插入排序裂开了,直接timeout
        :type nums: List[int]
        :rtype: int
        """
        # 特殊情况
        if len(nums) == 0 or len(nums) == 1:
            return 0
        
        # num_interval = dict()
        # 选择排序
        for i in range(0, len(nums)):
            # num_interval[nums[i]] = 0
            t = i
            for j in range(i+1, len(nums)):
                if nums[t] > nums[j]:
                    t = j
            temp = nums[t]
            nums[t] = nums[i]
            nums[i] = temp
            # # 更新所有数字的间隔
            # for m in range(0, i+1):
            #     if m == 0:
            #         num_interval[nums[m]] = abs(nums[1] - nums[0])
            #     elif m == len(nums)-1:
            #         num_interval[nums[m]] = abs(nums[m] - nums[m-1])
            #     else:
            #         num_interval[nums[m]] = max(abs(nums[m] - nums[m-1]), abs(nums[m] - nums[m+1]))
            max_interval = 0
        for i in range(len(nums)):
            if i == 0:
                max_interval = max(max_interval, abs(nums[1] - nums[0]))
            elif i ==len(nums)-1:
                max_interval = max(max_interval, abs(nums[i] - nums[i-1]))
            else:
                max_interval = max(max_interval, max(abs(nums[i] - nums[i-1]), abs(nums[i] - nums[i+1])))
        # return num_interval[max(num_interval,key=num_interval.get)]
        return max_interval
    def maximumGap(self, nums):
        """
        python中的sorted好像就是桶排序,这里偷懒直接用了,后面要去学习一下桶排序QAQ
        各种排序方法后面一定从头不上呜呜呜
        :type nums: List[int]
        :rtype: int
        """
        # 特殊情况
        if len(nums) == 0 or len(nums) == 1:
            return 0
        nums = sorted(nums)
        max_interval = 0
        for i in range(len(nums)):
            if i == 0:
                max_interval = max(max_interval, abs(nums[1] - nums[0]))
            elif i ==len(nums)-1:
                max_interval = max(max_interval, abs(nums[i] - nums[i-1]))
            else:
                max_interval = max(max_interval, max(abs(nums[i] - nums[i-1]), abs(nums[i] - nums[i+1])))
        return max_interval
# @lc code=end

s = Solution()
print(s.maximumGap([3,9,1,6]))

以上是关于LeetCode第164题—最大间距—Python实现的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode第164题—最大间距—Python实现

Leetcode No.164 最大间距(桶排序)

Leetcode No.164 最大间距(桶排序)

164. 最大间距

164 Maximum Gap 最大间距

LeetCode刷题模版:162164-166168