本文共 1206 字,大约阅读时间需要 4 分钟。
class Solution { public int minArray(int[] numbers) { int left = 0; int right = numbers.length - 1; // 利用二分查找的思想 使得left 和 right 落在最中间的两个位置,取其中最小的值 while(right - left > 1){ // 对左右去重 while(right - left > 1 && numbers[right-1] == numbers[right]){ right--; } while(right - left > 1 && numbers[left] == numbers[left+1]){ left++; } int mid = left + (right - left) / 2; /* 将 mid 和 right 位置的元素做比较。正常是right的大于mid, 这里是找最小的,所以将left和right往最小范围移动。 这里能用 mid 和 left 比较么?旋转数组中min的出现情况有三种。 5 1 2 3 4 : left是5,mid 是2,right是4;(旋转后min在mid的左边)midleft, mid left, mid>right 当处于第2和3情况是,mid都是大于left,其操作却不能统一,2需要 right = mid; 3需要left = mid;所以不用mid和left比较。 如果对mid和right比较,1、2两种情况mid都是小于right的,可以统一操作right = mid;当mid大于right时left = mid即可。 因此使用mid和right比较可以减少if判断的条件,统一操作。 */ if(numbers[mid] < numbers[right]){ right = mid; }else{ left = mid; } } return Math.min(numbers[left],numbers[right]); }}
转载地址:http://esozi.baihongyu.com/