给定一个旋转'N'次的排序数组。找到'N'的值。该数组可以包含重复元素

时间:2016-08-24 02:03:31

标签: arrays algorithm

例如,如果输入是(1,2,3,4,1),则ans是4  (1,2,3,4) - 大于0 (5,1,2,3) - →1 如果数组不包含重复元素,则解决起来非常简单(使用修改后的二进制搜索),但在这里,它包含重复元素? 提前致谢 !!

2 个答案:

答案 0 :(得分:2)

我认为原始的O(log N)方法将不再适用于数组包含重复元素的情况。

由于存在重复元素,因此在搜索“转折点”(数组元素为最大元素的点,后跟min元素)时,不能排除一半数组元素。

例如:{1,1,1,1,2,1},a [0] = a [5] = a [(0 + 5)/ 2] = 1。 你不能丢弃一半的元素,因为没有足够的信息表明转折点在哪里。

因此,一个非常直接的方法是O(N)顺序搜索转折点。

答案 1 :(得分:0)

def find_rot(a):
    m = min(a)
    x = float("-inf")
    for i, e in enumerate(a):
      if x > e:
        return i
      x = e
    return 0

找到小于前一个数字的第一个数字:该数字将是最大值翻到最小值的位置。如果没有这样的位置,那么阵列就不会旋转。