首先,感谢您抽出时间阅读这篇文章。
问题:
从给定数组中找到从 i 到 j (i!= j; i,j> = 0)的最短路径,而您只能移动左,右或转到与当前元素具有相同值的任何元素。
示例: 我有一个包含9个数字的数组:
int arr[9] = {7, 2, 5, 3, 8, 6, 9, 7, 0}
;int i = 1, j = 6;
根据上述声明,我想从
arr[i]
到arr[j]
(2到9),那么最短的路径是arr[1]
(2)->arr[0]
( 1st 7)->arr[7]
(2nd 7)->arr[6]
(9)(总共3个步骤)更多示例:
int arr[9] = {7, 2, 5, 3, 8, 6, 9, 7, 0}
;int i = 7, j = 8;
步骤:1(7-> 8)
int arr[9] = {8, 2, 0, 3, 8, 6, 9, 7, 0}
;int i = 0, j = 8;
步骤:3(0-> 1-> 2-> 8)
int arr[9] = {1, 5, 7, 3, 4, 22, 9, 8, 6}
;int i = 2, j = 7;
步骤:5(2-> 3-> 4-> 5-> 6-> 7)
我试图遍历数组中的所有元素( i 和 j 除外),以查看是否有任何元素具有相同的值并且最接近 j < / strong>,但我最终要处理更多案件。希望你们能帮助我,谢谢!!
答案 0 :(得分:1)
好的,最简单的方法是:
distance
,并用值-1
填充它。distance[i] = 0
,因为可以自由地从元素移动到自身distance
上循环,对于每个不是-1
的现有数字,在左侧和右侧的元素中填充当前元素的编号+ 1(仅当元素位于左/右等于-1
)array
中找到具有相同值的元素,并将其distance
设置为与步骤3中相同的值。一旦循环了足够多的时间,就会完全填充数组distance
,它将告诉您元素距元素array[i]
有多远。
如果您只需要distance[j]
并且已经找到它,则可以提早退出循环。