一、题目
力扣原题:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/
二、排序
class Solution {
public int findMin(int[] nums) {
if (null == nums || 0 == nums.length) {
return -1;
}
Arrays.sort(nums);
return nums[0];
}
}
- 时间复杂度:O(nlog(n))
- 空间复杂度:O(1)
三、遍历
class Solution {
public int findMin(int[] nums) {
if (null == nums || 0 == nums.length) {
return -1;
}
int result = nums[0];
for (int num : nums) {
result = Math.min(result, num);
}
return result;
}
}
- 时间复杂度:O(n)
- 空间复杂度:O(1)
四、二分查找
class Solution {
public int findMin(int[] nums) {
int low = 0;
int high = nums.length - 1;
int result = nums[0];
while (low < high) {
int mid = (low + high) / 2;
// 峰
if (mid + 1 < nums.length && nums[mid] > nums[mid + 1]) {
result = Math.min(result, nums[mid + 1]);
break;
}
// 谷
if (mid -1 >= 0 && nums[mid] < nums[mid - 1]) {
result = Math.min(result, nums[mid]);
break;
}
// 更新下标值
if (nums[mid] > nums[0]) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return result;
}
}
- 基本思路:二分查找。根据旋转数组的定义,画图可知,它是两段上升的数组,并且在旋转点存在一峰一谷,最小值即谷。因此问题可以转化为通过二分查找寻找位于谷的元素。
- 时间复杂度:O(log(n))。每次进行二分,时间复杂度为二叉树的最小深度,即O(log(n))。
- 空间复杂度:O(1)
五、总结
- 有序数组的元素定位应该第一时间想到二分查找。