问题如下:
如果可以循环移位其条目以使其变为排序,则称该数组是循环排序的。例如,图11.2中的数组是循环排序的 - 循环左移4乘以排序数组。设计一个
Z
算法,用于查找循环排序数组中最小元素的位置。假设所有元素都是不同的。例如,对于O(logN)
,返回值应为4。
解决方案的工作原理是将中间值与A [n-1]进行比较 - 取决于您可以将搜索范围缩小到带有拐点的列表侧面的关系。
我的解决方案:
list = [378, 478, 550, 631, 103, 203, 220, 234, 279, 368]
作者解决方案:
def cyclic_sorted_lst(A):
low, high = 0, len(A) - 1
while low <= high:
mid = (low + high) // 2
if A[mid] < A[high]:
high = mid
elif A[mid] == A[high]:
return mid
else:
low = mid + 1
我想知道我的解决方案是否会导致任何一个错误,或者两个解决方案是否同样好。我有什么想念的吗?至少对于问题描述中的示例,它运作良好。
答案 0 :(得分:-1)
根据我的评论,我写了一个简单的测试生成器来测试你的解决方案。这是代码:
def cyclic_sorted_lst(A):
low, high = 0, len(A) - 1
while low <= high:
mid = (low + high) // 2
if A[mid] < A[high]:
high = mid
elif A[mid] == A[high]:
return mid
else:
low = mid + 1
import random
i = 0
while True:
i += 1
print(i)
arr = list(set([random.randint(1, int(1000)) for _ in range(10)]))
arr.sort()
length = random.randint(1, len(arr))
cyclic_arr = arr[length:] + arr[:length]
print(cyclic_arr)
if cyclic_sorted_lst(cyclic_arr) != cyclic_arr.index(min(cyclic_arr)):
print(cyclic_arr, cyclic_sorted_lst(cyclic_arr), cyclic_arr.index(min(cyclic_arr)))
break
您的代码成功运行超过200K次迭代,所以我非常有信心它是正确的。