我的個人微信公衆號:Microstrong
微信公衆號ID:MicrostrongAI
微信公衆號介紹:Microstrong(小強)同學主要研究機器學習、深度學習、計算機視覺、智能對話系統相關內容,分享在學習過程中的讀書筆記!期待您的關注,歡迎一起學習交流進步!
知乎主頁:https://www.zhihu.com/people/MicrostrongAI/activities
題目描述
第一種問法:
有一個整數數組,請求出兩兩之差絕對值最小的值,記住,只要得出最小值即可,不需要求出是哪兩個數.
第二種問法:
有一個整數數組,請求出使得兩兩之差絕對值最小的兩個數下標。
解題思路
這裏我對第二種問法題目進行解答。
(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