题目:153
Find Minimum in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e.,0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
Find the minimum element.
You may assume no duplicate exists in the array.
题目分析:
从数据结构来分析,有序且是数组(顺序存储),查找最小的元素,首先最容易想到的就是折半查找(二分查找),如果没有旋转,则arr[mid]> arr[low],按从小到大排序,经过旋转后,如果arr[mid]> arr[low],最小值在右半区,如果arr[mid]< arr[low],最小值在左半边。有一些特殊的情况需要考虑,如当数组只有一个元素,数组就是按从小到大排序排好。返回在数组中的最小的元素。
这道题也是《剑指offer》面试题8。
(1) 朴素解法:
class Solution {
public:
int findMin(vector<int> &num) {
if (num.size() == 1)
return num[0];
int low, mid, high;
low = 0;
high = num.size() - 1;
while (low < high) {
mid = (low + high) / 2;
if (num[low] < num[high])
return num[low];
if (num[mid] > num[low])
low = mid;
else if (num[mid] < num[low])
high = mid;
else
return num[high];
}
}
};
(2) C code
20150527 (1)中解法已经很不错,再给出两种解法。
一个是:时间复杂度O(N)的,从后往前遍历数组中的元素,找到第一个该元素比其前一个元素小的就是旋转数组中的最小值,因为数组中的最小值是两个有序数组的分界值。
二个是:实现上有一些区别。
int findMin(int* nums, int numsSize) {
int start, end, mid;
start = 0;
end = numsSize - 1;
if (nums[start] <= nums[end])
return nums[start];
while (nums[start] > nums[end]) {
if (end - start == 1) {
start = end;
break;
}
mid = (start + end) / 2;
if (nums[mid] > nums[start])
start = mid + 1;
else
end = mid;
}
return nums[start];
}
看了下剑指offer,对于[ 2, 1] 这样的输入这么处理的。