新手算法学习之路----二分法Find Minimum in Rotated Sorted Array
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了新手算法学习之路----二分法Find Minimum in Rotated Sorted Array相关的知识,希望对你有一定的参考价值。
题目:假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2)。
你需要找到其中最小的元素。
你可以假设数组中不存在重复的元素。
思路:首先排除三种极端情况,空,只有一个元素,以及整个数组都是顺序排列的。
当顺序的数组随机旋转排列后,就分为两个顺序列入题目中的4567和012,寻找到中间数来和数组最后一个元素对比,如果大于的话说明最小的数在中间数的右边,如果小于的话说明最小数在中间数的左边,然 后继续按照二分法来找。注:不会出现中间数等于最后一个元素,因为题目中说明了没有重复元素。
问题:我当时的思路是这两个数组能不能被分成两部分,两个升序数组来求最小数,最后证明不对;由于思维被禁锢在二分法使用的前提是一个排好序的数组,结果更本没有想到使用下边的办法,这个是我借鉴别人的偶,自己又简化了一下。
public int findMin(int[] nums) { // write your code here if( nums == null || nums.length == 0) //先排三种特殊的情况 return 0; if(nums.length == 1) return nums[0]; int low = 0; int high = nums.length -1; int mid = low; while(low < high){ mid = (low + high)/2; if(nums[mid] > nums[high]){ //如果中间大于最后一个元素那说明最小的数在中间数的右边 low = mid + 1; //数组的前一半排除掉 }else if( nums[mid] < nums[high]){ //如果中间数小于最后一个元素,说明中间数后面部分的升序部分里面,那最小说就在中间数左边了 high = mid ; } } return nums[low];
}
以上是关于新手算法学习之路----二分法Find Minimum in Rotated Sorted Array的主要内容,如果未能解决你的问题,请参考以下文章
新手算法学习之路----二分法Search-A-2D-Matrix
新手算法学习之路----二分法Maximum-in-Mountain-Sequence