【算法-微軟面試題】求一個整數數組元素間最小差值

我的個人微信公衆號: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  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章