【问题标题】:Determine if an array is decreasing-increasing O(log(n)) and find the "switch" value确定一个数组是否在递减递增 O(log(n)) 并找到“开关”值
【发布时间】: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 描述说“模式从升序变为降序时的值”,这当然与“这将是数组中的最小值”相矛盾。由于唯一的变化是交换 &gt;&lt;,我认为适用于任一变体的解决方案就足够了。
  • @Eesa 如果您要求列表中完全没有重复项,这真的很容易,这是一个有趣的问题,您可以从解决中受益。如果您之前尝试过假设重复来解决它,请再次尝试假设没有重复。

标签: python algorithm binary-search


【解决方案1】:

在您的示例中存在重复。没有重复,这很容易。检查三个不同索引处的值。调用这些 x、y 和 z,我们可以看到边界只能位于 (x,y)、(y,z)、(z,x) 三个区间中的一个。因此,如果我们查看这些对的顺序,2 将是升序,1 将是降序,或者相反。大多数匹配数组。然后,您可以使用二进制搜索来查找边界。这是 O(log n)

对于重复,这需要(在最坏的情况下)线性时间。一个不好的例子是你有一个数组,其中除了 2 个元素之外的所有元素都是相同的。在这种情况下,只需 O(n) 即可找到不同的元素。一般来说,重复使用相同的算法,但您需要额外的工作来查找不同的元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-08
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    相关资源
    最近更新 更多