class Solution {
public int minArray(int[] nums) {
int left = 0;
int right = nums.length-1;
while ( left < right) {
int mid = left + ( right - left) / 2;
if ( nums[mid] > nums[right] ){// mid在左序列 偏小
left = mid+1;
}else if(nums[mid]<nums[right]){//mid在右序列 偏大
right = mid;
}else{// 缩小right范围
right--;
}
}
return nums[left];
}
}
class Solution {
public int minArray(int[] numbers) {
int left = 0, right = numbers.length-1;
while(left < right){
int mid = (left + right)/2;
if(numbers[mid] > numbers[right]){
left = mid+1;
}else if(numbers[mid] < numbers[right]){
right = mid;
}else{
right--;
}
}
return numbers[right];
}
}
class Solution {
public int findMin(int[] nums) {
int left = 0;
int right = nums.length-1;
while(left<right){
int mid = left + ((right-left)>>1);
if(nums[mid]>nums[right]){
left=mid+1;
}else if(nums[mid]<nums[right]){
right=mid;
}else{
right-=1;
}
}
return nums[left];
}
}
//二分思想,时间复杂度O(logn)
class Solution {
public:
int minArray(vector<int>& numbers) {
int left = 0;
int right = numbers.size()-1;
while(left<right)
{
int mid=(left+right)/2;
if(numbers[mid]>numbers[right]) left=mid+1;
else if(numbers[mid]==numbers[right]) right--;
else right=mid;
}
return numbers[right];
}
};
共以下 9 个回答
//1.暴力遍历法,找到第一次出现后面大于前面的位置进行返回
//2.二分查找
相等的时候一直不知道怎么处理,看的答案
“`java//寻找旋转数组的最小值
class Solution {
public int minArray(int[] numbers) {
}
“`
当mid等于right时,无法判断mid是在左排序数组中还是在右排序数组中,因此,右指针往左移一位,缩小范围。
例:[4,5,3,3,3],[3,3,1,3]
使用二分思想
注意:
循环结束条件:low < high
numbers[mid] < numbers[high]情况下不能排除mid本身
相等情况下仅缩小比较点本身(这里是high)
时间复杂度:最坏O(n),平均O(log (n));
二分
看完讲解才知道重复怎么处理