求陣列中兩個元素最小距離 動態規劃

2021-10-02 19:50:01 字數 1737 閱讀 8173

要求:

給定乙個陣列,陣列中含有重複元素,給定兩個數字num1和num2,求這兩個數字在陣列**現位置的最小距離。

分析:方法一:蠻力法

主要思路為:對陣列進行雙重遍歷,外層迴圈遍歷查詢num1,只要遍歷到num1,內層迴圈對陣列從頭開始遍歷找num2,每當遍歷到num2,就計算他們距離dist。當遍歷結束後最小的dist值就是他們最小的距離。

方法二:動態規劃

什麼是動態規劃? 

假設給定陣列[4,5,6,4,7,4,6,4,7,8,5,6,4,3,10,8],num1 =4,num2=8。執行過程如下:

①在遍歷的時候首先會遍歷到4,下標為lastpos1=0,由於此時沒有遍歷到num2,因此沒必要計算num1與num2的最小距離;

②接著往下遍歷,又遍歷到num1=4,更新lastpos1=3;

③接著往下遍歷,又遍歷到num1=4,更新lastpos1=5;

④接著往下遍歷,又遍歷到num1=4,更新lastpos1=7;

⑤接著往下遍歷,又遍歷到num2=8,更新lastpos2=9;此時由於前面已經遍歷過num1,因此,可以求出當前num1與num2的最小距離為|lastpos2-lastpos1| = 2;

⑥接著往下遍歷,又遍歷到num1=4,更新lastpos1=12;此時由於前面已經遍歷過num2,因此,可以求出當前num1與num2的最小距離為|lastpos2-lastpos1| = 4;由於4>2,所以暫時num1與num2的最小距離為2;

⑦接著往下遍歷,又遍歷到num2=8,更新lastpos2=15;此時由於前面已經遍歷過num1,因此,可以求出當前num1與num2的最小距離為|lastpos2-lastpos1| = 3;由於3>2,所以num1與num2的最小距離最終為2;

**實現:

#方法二

def mindistance(arr,num1,num2):

if arr == none or len(arr) <= 0:

print("引數不合理!")

return 2**32

lastpos1 = -1 #上次遍歷到num1的位置

lastpos2 = -1 #上次遍歷到num2的位置

mindis = 2**30 #num1與num2的最小距離

i = 0

while i < len(arr):

if arr[i] == num1:

lastpos1 = i

if lastpos2 >= 0:

mindis = min(mindis,abs(lastpos1-lastpos2))

if arr[i] == num2:

lastpos2 = i

if lastpos1 >= 0:

mindis = min(mindis,abs(lastpos2-lastpos1))

i += 1

return mindis

if __name__ == "__main__":

arr = [4,5,6,4,7,4,6,4,7,8,5,6,4,3,10,8]

num1 = 4

num2 = 8

print(mindistance(arr,num1,num2))

效能分析:

方法一需要對陣列進行兩次遍歷,因此時間複雜度為o(

方法二只需要對陣列進行一次遍歷,因此,時間複雜度為o(n)。

找到陣列中兩個最小的元素

1 基本思路 設定兩個min1 min2變數,分別儲存第乙個最小的資料,第二個的資料。先將其初始化為乙個相當大的值,然後依次與陣列中的每乙個元素比較,只有當比min1大的時候才會去比較min2,如此比較下來便可以得到陣列中兩個最小的元素。如果初始化的時候只是設定為第乙個元素的值,在特殊情況下,第乙個...

求陣列中相差最小的兩個數O N

基本思想 1.遍歷該陣列 找出該陣列中最小和最大值,則所求的兩個整數的差值一定小於等於max min 2.從頭開始 乙個乙個元素與 max min 2 比較,如果小於,則表示所求的兩個整數的差值介於min 到 a i 之間 更新max a i 如果大於,則表示所求的兩個整數的差值介於a i 到max...

兩個有序陣列,求陣列中差值最小值

1.有序陣列int i1 int i2 2.將其中乙個有序陣列倒序取負值。3.將陣列拼接integer i3 4.然後先正向迴圈i1,依次取出i2中元素,求和,若和大於等於0,正向迴圈結束,start i,否則start i1.length 1 5.然後先反向迴圈i2,依次取出i1中元素,求和,若和...