【算法-微软面试题】求一个整数数组元素间最小差值

我的个人微信公众号:Microstrong

微信公众号ID:MicrostrongAI

微信公众号介绍:Microstrong(小强)同学主要研究机器学习、深度学习、计算机视觉、智能对话系统相关内容,分享在学习过程中的读书笔记!期待您的关注,欢迎一起学习交流进步!

知乎主页:https://www.zhihu.com/people/MicrostrongAI/activities

Github:https://github.com/Microstrong0305

个人博客:https://blog.csdn.net/program_developer

题目描述

第一种问法:

有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数.

第二种问法:

有一个整数数组,请求出使得两两之差绝对值最小的两个数下标。

解题思路

这里我对第二种问法题目进行解答。

(1)方法一:暴力穷举

    # 方法一:暴力穷举
    # 时间复杂度为O(n)
    def getMin(self, nums):
        temp_i = -1
        temp_j = -1
        length = len(nums)
        min_ = sys.maxsize
        for i in range(length - 1):
            for j in range(i + 1, length - 1):
                current = abs(nums[i] - nums[j])
                min_ = min(min_, current)
                if min_ == current:
                    temp_i = i
                    temp_j = j
        return (temp_i, temp_j)

(2) 方法二:先排序,再求相邻两个数的差值

    # 方法二:先排序,再求相邻两个数的差值
    # 时间复杂度为0(nlogn)
    def getMin2(self, nums):
        temp_i = -1
        temp_j = -1
        nums.sort()
        min_ = sys.maxsize
        for i in range(1, len(nums)):
            current = abs(nums[i] - nums[i - 1])
            min_ = min(min_, current)
            if min_ == current:
                temp_i = i
                temp_j = i - 1
        return (temp_j, temp_i)

(3)方法三:设立辅助数组(不排序,直接求相邻两个数的差值)

思路分析:
设立辅助数组。以下是设立辅助数组的基本思路。
设辅助数组为Bn.原来题目中给定的数组是An,则Bn等于:

 B1 = A1 - A2;
 B2 = A2 - A3;
 B3 = A3 - A4;
 ……
 Bn-1 = An-1 - An.

注意,Bn的长度是n-1,正好比An要小一个。聪明的同学看到这个辅助数组,立马就能猜到原因了,因为这样做的话,我们能够把这道看似无从下手求出最优解的问题转化为求Bn数组中连续和的绝对值最小的数,因为Bn的连续子序列和便是An任意两数之差(注意,由于题目要求的是绝对值最小,所以求出A1-A2等效于得出A2-A1),例如:

A2 - A5 = B2 + B3 + B4 = A2 - A3 + A3 - A4 + A4 - A5 = A2 - A5

Reference:

 【1】https://blog.csdn.net/baidu_37107022/article/details/72830136  

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页