A[x,...,y]
是整数数组,x,y是自然数&gt; = 1和x <= y
。
Foo(Array,x,y)
if (x=y): return Array[x]
else:
m=(x+y)/2
return min(Foo(Array,x,m), Foo(Array(m+1),y)
我试图弄清楚如何编写这段代码的非递归版本,找到未排序数组中的最小值。
我尝试使用while循环,其中(x!= y)但是我无法弄清楚如何移动m直到它到达x = y并终止并返回最小值。我还想知道是否可以在不弹出m和m + 1的最大值的情况下完成
答案 0 :(得分:4)
如果你想找到一根棍子的质心(你可以在一根手指上平衡它的点),只需用两根手指在两端握住它,然后慢慢地将它们一起移动。
类似的方法适用于查找数组中的最小元素:
findMin(Arr,x,y):
while(x < y):
if (Arr[x] < Arr[y])
y-=1
else
x+=1
return Arr[x]
答案 1 :(得分:1)
如果您只是使用堆栈来保存待定比较,那么这个想法非常简单。类似的东西:
Func Min(a, x, y)
min_value = INT_MAX // largest possible int
s = empty stack of (x,y) pairs
s.push(x,y)
while (!s.isEmpty())
x,y = s.pop()
if (x == y)
{
if (a[x] < min_value)
min_value = a[x]
}
else
{
m = (x+y)/2
s.push(a, x, m)
s.push(a, m+1, y)
}
}
return min_value
请注意,这是递归代码的非递归转换。它根本不打算成为如何获得最小数字数组的推荐。