有一个旋转的数组,我们需要在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
是数据透视的索引。那我们为什么不归还呢?答案 0 :(得分:1)
在您描述的情况下,nums[m]
不一定是最小元素。
例如,如果数组为[6, 7, 1, 2, 3, 4, 5]
,则在第一次迭代期间我们得到:
i = 0
,j = 6
,m = 3
。 nums[m] = 2
,小于nums[i]
,但显然不是最小值。