在旋转的数组中找到min。了解实施

时间:2016-11-02 18:44:32

标签: java arrays algorithm

有一个旋转的数组,我们需要在log n时间找到它的min元素。我找到了几个解决方案here,但无法理解其中一个:

public int findMin(int[] nums) {
    if(nums==null || nums.length==0)
        return -1;

    int i=0; 
    int j=nums.length-1;

    while(i<=j){
        // Sorted (sub)array. We just return its first element.
        if(nums[i]<=nums[j])
            return nums[i];

        int m=(i+j)/2;

        if(nums[m]>=nums[i]){
            i=m+1; // The pivot is in the right subarray. So we go right
        }else{
            j=m; // m is the index of the pivot. Why don't we just return it?
        }
    }

    return -1;
}

我看到以下三个选项:

  • (子)数组已排序。我们只是返回它的第一个元素。
  • 枢轴位于右侧子阵列中。所以我们走对了。
  • m是数据透视的索引。那我们为什么不归还呢?

1 个答案:

答案 0 :(得分:1)

在您描述的情况下,nums[m]不一定是最小元素。

例如,如果数组为[6, 7, 1, 2, 3, 4, 5],则在第一次迭代期间我们得到:

i = 0j = 6m = 3nums[m] = 2,小于nums[i],但显然不是最小值。