题解 | #旋转数组的最小数字#
旋转数组的最小数字
https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba
这里是我自己画的,最直观的图片了,经过旋转后,数据是分层的,通过分层的数据,确实可以快速定位到,最小值的位置。
nums[mid] < nums[high] nums[mid] > nums[high] nums[mid] < nums[high]
最小值在中间 最小值在右间 最小值在左间
解题思路:
从上面可以看到,因为旋转后的数据,依旧是分层的,还是可以快速判断,最小值在那一边。
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型 */ public int minNumberInRotateArray (int[] nums) { int low = 0; int high = nums.length -1; while(low <= high) { int mid = low + (high - low) /2; // 不好确认在左右,所以排除掉最后面的一个,再一个个试 if(nums[mid] == nums[high]) { high = high - 1; } // 说明最小数在右边 else if(nums[mid] > nums[high]) { low = mid + 1; } // 说明最小数在左边 else { high = mid; } } return nums[low]; } }
当数据是【6,4】的时候
第一次循环 | 第二次循环 | |
mid | 0 | 因为low==high退出循环了,所以最终low=1 |
low | 1 | |
high | 1 |
所以最终的low的值是1
当数据是【1,0,1,1】
第一次循环 | 第二次循环 | 第三次循环 | |
mid | 1 | 0 | 因为low==high退出循环,所以最终low=1 |
low | 0 | 1 | |
high | 1 | 1 |