参考:B站UP--子烁爱学习(推荐大家观看原视频)
题目描述:
题目解析
举个例子1-2-3-4-5,旋转3-4-5-1-2,旋转过去的部分是1-2,留下的部分是3-4-5。
首先,1-2这一部分肯定是小于等于留下部分3-4-5的最开头的数字的,而且最小的元素也肯定是在旋转的部分中。
这样就可以从后往前遍历,取比留下部分最开头的数字小的数字之中最小的数字即可。
折半查找:
12345-->34512,这样我们取中间的数字进行比较,中间是5,这个数字是比左边开头大,也比右边结尾大的,那么这时候就将左边的标志移动到5这个位置,右边不变,这时候,再取中间,中间是1,这个数字就是比右边尾巴小,也比左边头大,那么此时就将右边的标志移动到1这个位置,此时右边的标志—左边的标志==1,这时候,就能确定范围内只剩下两个数字,那么就只要比较这两个就好了
代码示例:
public class Algorithm06 { public int minNumberInRotateArray(int [] array) { int left=0; int right=array.length-1; while(left<right){ //这个mid必须放在这里,因为mid是left和right的中间(包括更新后的),这样才能缩小范围 int mid=(left+right)/2; if(right-left==1){ return Math.min(array[left],array[right]); } if(array[mid]>=array[left]){ left=mid; } if(array[mid]<=array[right]){ right=mid; } } return 0; } }