【发布时间】:2020-09-15 19:46:07
【问题描述】:
我试图确定一个数组是否先减少然后增加。 我还需要找出模式从升序变为降序时的值,这将是数组中的最小值
假设我有以下数组:
[10, 10, 10, 10, 10, 10, 8, 8, 8, 6, 6, 6, 6, 6, 4, 3, 12, 13, 22, 31, 40, 59, 78]
还有这个
[-1, 1, 2, 4, 8, 16, 32, 64]
编辑:为简单起见,您可以假设这些值不会像我向您展示的第一个示例那样重复
我主要想写一个花费 O(logn) 时间的程序。 我正在尝试使用二进制搜索,这就是我想出的。该函数的输入是一个排序列表或一个降序-升序列表。可以有重复的值,如上面的例子所示
def find_middle(ls):
start = 0
end = len(ls) - 1
idx = -1
while start < end:
mid = start + (end - start) // 2
middle = ls[mid]
if ls[mid-1] <= middle and middle > ls[mid+1]):
return middle
elif ls[mid-1] < middle:
start = mid
else:
end = mid
return idx
抱歉代码乱七八糟,我已经修改了很多,此时我刚刚放弃寻找解决方案。
如果数组只是减少或增加,我希望函数返回 -1。
任何帮助将不胜感激!
【问题讨论】:
-
这是作业吗?
-
是什么让您认为这可以通过二分搜索或
O(log n)来完成?例如,在[1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1]的情况下,您希望二分查找如何工作? -
如果这是一个挑战问题,请准确提供它的任务和限制。试图解决对具有挑战性问题的二手描述毫无意义。
-
@DarrylG 描述说“模式从升序变为降序时的值”,这当然与“这将是数组中的最小值”相矛盾。由于唯一的变化是交换
>和<,我认为适用于任一变体的解决方案就足够了。 -
@Eesa 如果您要求列表中完全没有重复项,这真的很容易,这是一个有趣的问题,您可以从解决中受益。如果您之前尝试过假设重复来解决它,请再次尝试假设没有重复。
标签: python algorithm binary-search