二分查找,范围逼近 减治思想
当 nums[mid]小于最右边的数,说明旋转点在[left,mid]的区间内 ,将查找区间的右边界变为mid(细节)
当 nums[mid]大于最右边的数,说明旋转点在[mid+1,right]的区间内,将将查找区间的左边界变为mid+1
当 nums[mid]等于最右边的数,就将right–,缩小范围,因为 right–并不会结果产生影响,
为什么? 因为right–的前提条件为nums[mid] = nums[right],那么该nums[right]一定不为旋转点
最后返回nums[left];
public int minArray(int[] numbers) {
if (numbers.length == 0) return 0;
/** 二分,范围逼近 减治思想*/
int left = 0;
int right = numbers.length - 1;
int mid = 0;
while (left < right) {
mid = left + (right - left) / 2;
/** 如果mid小于最右边的数,说明旋转点在[left,mid]的区间内*/
if (numbers[mid] < numbers[right]) right = mid ;
/** 如果mid小于最右边的数,说明旋转点在[mid+1,right]的区间内*/
else if (numbers[mid] > numbers[right]) left = mid + 1;
/** 如果mid等于最右边的数,就将right--,缩小范围(至于为什么,别问,不知道)
* 因为 right--并不会结果产生影响,
* 为什么? 因为right--的前提条件为nums[mid] = nums[right],那么该nums[right]一定不为旋转点*/
//[3,3,1,3]
//[1,3,3,3]
else right--;
}
return numbers[left];
}

这篇博客介绍了如何利用二分查找策略解决旋转数组中的最小值问题。通过范围逼近的减治思想,根据中间元素与最右边元素的关系,逐步缩小搜索范围。当找到等于最右边元素的值时,由于该值不为旋转点,可以安全地减小右边界,最终找到最小值。
438

被折叠的 条评论
为什么被折叠?



