无序数组排序后的最大相邻差(Python)

一、题目描述
有一个无序整型数组,如何求出该数组排序后的任意两个相邻元素的最大差值?要求时间复杂度和空间复杂度尽可能的低

二、解题思路

1、方法一
我们可以使用任何一种高效算法,然后再对相邻的两个元素求差值。
这种方法效果比较差,因为这个题显然不是让我们排序的,但是也可以实现一下。
我们找一种时间复杂度为O(nlogn)的排序算法,这里使用快排。

代码实现:

# 无序数组求最大相邻差

def QuickSort(arr=[],left=None,right=None):
    left=0 if not isinstance(left,(int,float)) else left
    right=len(arr)-1if not isinstance(right,(int,float)) else right
    if left>right:
        return
    pivot_index=partition(arr,left,right)
    QuickSort(arr,left,pivot_index-1)
    QuickSort(arr,pivot_index+1,right)

    return arr

def partition(arr,star_index,end_index): # 使用单边循环法
    pivot=arr[star_index]
    mark=star_index
    for i in range(star_index+1,end_index+1):
        if arr[i]<pivot:
            mark += 1
            arr[mark],arr[i]=arr[i],arr[mark]
    arr[star_index]=arr[mark]
    arr[mark]=pivot
    return mark

def get_max_distance(arr=[]):
    max_distance=0
    for i in range(len(arr)-1):
        temp_distance=arr[i+1]-arr[i]
        if temp_distance>max_distance:
            max_distance=temp_distance
    return max_distance

if __name__=='__main__':
    array=[3,44,38,5,15,36,46,2,48,19]
    print(QuickSort(array))
    print(get_max_distance(array))

在这里插入图片描述

2、方法二

我们可以利用计数排序的思想,把数据先放入统计数组中,对于计数排序,我们知道,当该数据出现一次,我们就会把该数据放入到统计数组中,所以统计数组中的一部分元素就变成了1或者更高的值,一部分元素则依然为0 。
我们可以遍历统计数组,相邻元素的最大差就为:统计数组中最大连续出现0值的次数+1

代码实现

# 无序数组求最大相邻差

def get_max_distance(arr=[]):
    max_value=max(arr)
    min_value=min(arr)
    d=max_value-min_value
    countArray_Length=d+1
    countArray=[0]*countArray_Length
    for i in range(len(arr)):
        countArray[arr[i]-min_value]+= 1

    # 统计连续出现0的次数
    cur_time = 1
    max_time = 1
    for i in range(countArray_Length - 1):
        if countArray[i] == 0:
            if countArray[i] == countArray[i + 1]:
                cur_time += 1
                max_time = max(cur_time, max_time)
            else:
                cur_time = 1

    return max_time+1

if __name__=='__main__':
    array=[3,44,38,5,15,36,46,2,48,19]
    print(get_max_distance(array))

3、方法三

我们知道当数据大小差别很大时,再用计数排序就不那么明智了。比如,数据是1,2,3,1784 时,再用计数排序会浪费很多空间,这个时候用桶排序比较好,同时,无序数组排序后的最大相邻差我们也可以借助桶排序的思想。
解决这个问题,我们只需要把原数组的每一个元素放到对应的桶中,记录下来每一个桶中的最大和最小元素。
遍历所有的桶,统计出每一个桶的最大值,和这个桶左边的非空桶的最小值的差,差值最大的即为原数组排序后的相邻最大差值。

这个方法不需要像标准桶排序那样在每一个桶内进行排序,只需要记录筒内的最大值和最小值即可,所以时间复杂度为O(n)

代码实现:

# 无序数组求最大相邻差
class Bucket:
    def __init__(self):
        self.min=None
        self.max=None

def get_max_distance(arr=[]):
    max_value=max(arr)
    min_value=min(arr)
    d=max_value-min_value
    # 如果d=0,则说明所有元素都相等,返回0
    if d==0:
        return 0
    # 初始化桶
    bucket_num=len(arr)
    buckets=[]
    for i in range(0,bucket_num):
        buckets.append(Bucket()) #每个桶只记录了桶内最大值和最小值
    # 遍历原始数组,确定每个桶的最大值和最小值
    for i in range(0,len(arr)):
        # 确定数组元素所归属的桶下标
        index=int((arr[i]-min_value)*(bucket_num-1)/d)
        if buckets[index].min is None or buckets[index].min>arr[i]:
            buckets[index].min=arr[i]
        if buckets[index].max is None or buckets[index].max<arr[i]:
            buckets[index].max=arr[i]
    # 遍历桶,找到最大值
    left_max=buckets[0].max
    max_distance=0
    for i in range(1,bucket_num):
        if buckets[i].min is None:
            continue
        if buckets[i].min-left_max>max_distance:
            max_distance=buckets[i].min-left_max
        left_max=buckets[i].max
    return max_distance

if __name__=='__main__':
    array=[3,44,38,5,15,36,46,2,48,19]
    print(get_max_distance(array))

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术工厂 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读