题目:给定一个数组,数组中含有重复元素,给定两个数组num1和num2,求这两个数字在数组中出现的最小距离。
分析:动态规划法。动态规划的方法可以把每次遍历的结果都记录下来从而减少遍历次数。当遍历数组时,会遇到以下两种情况:
(1)当遇到num1时,记录下num1值对应的数组下标的位置lastPos1,通过求lastPos1与上次遍历到num2下标位置的值lastPos2的差可以求出最近一次遍历到num1与num2的距离。
(2)当遇到num2时,记录下num2值对应的数组下标的位置lastPos2,通过求lastPos1与上次遍历到num2下标位置的值lastPos2的差可以求出最近一次遍历到num1与num2的距离。
code:
def minDis(arr, num1, num2):
if arr is None or len(arr) <= 0:
return 2 ** 32
lastPos1 = -1
lastPos2 = -1
minDis = 2 ** 32
i = 0
while i < len(arr):
if arr[i] == num1:
lastPos1 = i
if lastPos2 >= 0:
minDis = min(minDis, abs(lastPos2 - lastPos1))
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(minDis(arr, num1, num2))
程序运行结果为:
2
