题目描述:
无重复数字的旋转数组:
有重复数字的旋转数组:
暴力思路:
- 暴力遍历查找最小值: 时间复杂度 O(n)
- 排序后再取最后一个:时间复杂度 O(nlogn)
题解:
无重复数字的旋转数组:
/**
* 二分查找
* 时间复杂度是: O(logn)
* 空间复杂度是:O(1)
* @param nums
* @return
*/
public int findMin_3(int[] nums) {
int left = 0;
int right = nums.length - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] > nums[right]) {
left = mid + 1;
} else {
right = mid;
}
}
return nums[left];
}
有重复数字的旋转数组:
/**
* 剑指 offer 第 11 题
* 在原来的题目之上,假设数组中的元素可以重复
* 可以使用二分查找
* 时间复杂度是: O(logn)
* 空间复杂度是:O(1)
* @param nums
* @return
*/
class Solution {
public int minArray(int[] numbers) {
int left = 0,right = numbers.length - 1,mid = 0;
while(left < right){
mid = left + (right - left) / 2;
if(numbers[mid] > numbers[right]){
left = mid + 1;
}else if(numbers[mid] < numbers[right]){
right = mid;
}else{
right--;
}
}
return numbers[left];
}
}
分享:
你不一定要逆风翻盘,重要的是在路上。