题目描述:
给定一个数组,数组中含有重复元素,给定两个数字 num1 和 num2,求这两个数字在数组中出现的位值的最小距离。
方法:
最简单的方法是对数组进行双重遍历,找出最小距离,但是效率低下。由于在求距离的时候只需要关心 num1 与 num2 这两个数,所以只需要对数组进行一次遍历即可,在遍历的时候分别记录遍历到 num1 或 num2 的位置就可以求出最小距离。
- 蛮力法
- 动态规划法
1.蛮力法
对数组进行双重遍历,外层循环遍历查找 num1,只要遍历到 num1,内层循环对数组从头开始
遍历找 num2,每当遍历到 num2,就计算它们的距离 dist。当两层遍历结束后最小的 dist值就是它们的最小距离。
代码实现:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2020/1/29 18:58
# @Author : buu
# @Software: PyCharm
# @Blog :https://blog.csdn.net/weixin_44321080
def minDist(arr, num1, num2):
if arr == None or len(arr) <= 0:
print('参数不合理!')
return 2 ** 32
mindis = 2 ** 32
i = 0
while i < len(arr):
if arr[i] == num1:
j = 0
while j < len(arr):
if arr[j] == num2:
dist = abs(i - j)
if dist < mindis:
mindis = dist
j += 1
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:', minDist(arr, num1, num2))
结果:
算法性能分析:
此方法要对数组进行两次遍历,所以时间复杂度为O(n**2).
2.动态规划
方法1的内层循环对 num2 的位置进行了很多次重复的查找。可以采用动态规划的方法把每次遍历的结果都记录下来从而减少遍历次数。具体实现思路为:遍历数组,会遇到以下两种情况:
(只需对数组进行一次遍历)
(1) 当遇到 num1 时,记录下 num1 对应的数组下标位置 lastPos1,通过求 lastPos1与上次遍历到 lastPos2 的差可以求出最近一次遍历到的 num1 与 num2 的距离。
(2) 当遇到 num2 时,同样记录下它在数组中下标的位置 lastPos2,然后通过求 lastPos2 与上次遍历到的 num1 的下标值 lastPos1,求出最近一次遍历到的 num1 与 num2 的距离。
代码实现:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2020/1/29 19:16
# @Author : buu
# @Software: PyCharm
# @Blog :https://blog.csdn.net/weixin_44321080
def minDist(arr, num1, num2):
if arr == None or len(arr) <= 0:
print('参数不合理!')
return 2 ** 32
mindist = 2 ** 32
i = 0
lastPos1 = -1
lastPos2 = -1
while i < len(arr):
if arr[i] == num1:
lastPos1 = i
if lastPos2 >= 0:
mindist = min(mindist, abs(lastPos1 - lastPos2))
if arr[i] == num2:
lastPos2 = i
if lastPos1 >= 0:
mindist = min(mindist, abs(lastPos1 - lastPos2))
i += 1
return mindist
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:', minDist(arr, num1, num2))
结果:
算法性能分析:
此方法只对数组进行一次遍历,所以时间复杂度为O(n);
end