在Sorted Rotatable Array中查找最小数字

Lol*_*lly 17 algorithm

我在一次采访中遇到了这个问题.请帮我解决问题.

问题是:

你有可旋转的阵列,i.即 数组包含已排序的元素,它可以循环旋转,就像数组中的元素是[5,6,10,19,20,29]然后旋转第一次数组成为[29,5,6,10,19] ,20]并且第二次变为[20,29,5,6,10,19],依此类推.

所以你需要在任何点找到数组中的最小元素.您将不会被提供数字时间数组旋转.只是给出旋转的数组元素并找出其中最小的元素.在这种情况下,输出应为5.

cod*_*ict 38

方法1:

你可以及时做到这一点O(logN).

使用修改后的二进制搜索找到旋转点,这是一个索引i这样
arr[i] > arr[i+1].

例:

[6,7,8,9,1,2,3,4,5]
       ^
       i
Run Code Online (Sandbox Code Playgroud)

两个子数组
(arr[1], arr[2], .., arr[i])
(arr[i+1], arr[i+2], ..., arr[n])进行排序.

答案是 min(arr[1], arr[i+1])

方法2:

当排序,旋转阵列分为两半部分(arr[1],..,arr[mid])(arr[mid+1],..,arr[n]),它们中的一个总是排序,而另一个总是具有分钟.我们可以直接使用修改后的二进制搜索来继续搜索未排序的一半

// index of first element
l = 0

// index of last element.
h = arr.length - 1

// always restrict the search to the unsorted 
// sub-array. The min is always there.
while (arr[l] > arr[h]) {
        // find mid.
        mid = (l + h)/2
        // decide which sub-array to continue with.
        if (arr[mid] > arr[h]) {
                l = mid + 1
        } else {
                h = mid
        }
}
// answer
return arr[l]
Run Code Online (Sandbox Code Playgroud)

  • 如果数组包含重复的条目,这将不起作用. (4认同)