题解 | 旋转数组的最小数字
旋转数组的最小数字
https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型 */ //找到峰值 峰值后的一个元素就位最小值 //ab ba 89 12 3 4567 3456 7 891 public int binartSort(int left,int right,int[] nums){ int mid = (left+right)/2; if (left==right){ return nums[mid]; } if (nums[mid]>nums[mid+1]){ return nums[mid+1]; } if(nums[mid]>nums[right]){ return binartSort(mid,right,nums); }else if (nums[mid]<=nums[right]){ return binartSort(left,mid,nums); } return 0; } public int minNumberInRotateArray (int[] nums) { // write code here return binartSort(0,nums.length-1,nums); } }
这道题的题目是将AB 一个有序的数组 变成一个无需的数组BA ,刚开始的想法是找到这个数组的峰值,峰值的后面一个元素也就是最小的元素,但是忽略了 这种情况,这种情况下,按照将mid和mid+1的不断比较去找峰值的做法是无法通过的 101111。
最终这种解法只通过了四个用例。
按照我之前的这种做法,对于上述用例,似乎只能在mid 和right 区间中找最小值,但是该用例的最小值却在左边区间,因此想到了是否有什么方法去定位区间,想到了可以与边界值进行比较。
对于这个例子 //ab ba 8912 3 4567 3456 7 8912
在这个例子中,如果a的长度大于b的长度,旋转后则会导致mid和尾部的值都是在a中取到,则会导致mid的值小于尾部的值。
反之,如果a的长度小于b的长度,旋转后,mid在b中取,尾部的值在a中取,a中的所有值都小于b的值,则自然mid的值大于尾部的值。
然后我就使用该方法定位区间,通过不断递归找到 mid>mid+1的情况。mid+1则为最小值。
题目给的要求是非递减数组旋转,则还有一种情况
对于 11 1 11 这种情况 按照我写完的算法,是无法处理的 因此,我增加了 这行代码。
if (left==right){ return nums[mid]; }
这道题目的思路有点绕,虽然最后稀里糊涂写对了hhhh