要求:
給定乙個陣列,陣列中含有重複元素,給定兩個數字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中元素,求和,若和...