题目153:Find Minimum in Rotated Sorted Array I II
也是《offer》面试题8:旋转数组的最小数字。
I 和 II的区别是旋转数组是否有重复数字
1. 旋转数组中无重复数字
题目分析:
关键是明白旋转数组是将原来的有序数组旋转后变成两个有序的数组,且左边的有序数组的最小值一定大于右边有序数组的最小值,否则直接返回旋转数组中最左边的值。
其实,是一段线段,分成两段后,看中点的元素落在哪一段中。
直接上代码:
class Solution {
public:
int findMin(vector<int>& nums) {
int left, right, mid;
left = 0;
right = nums.size() - 1;
while (nums[left] > nums[right]) {
if (right - left == 1) {
left = right;
break;
}
mid = (left + right) / 2;
/* left和right的变化画图就会很清晰 */
if (nums[mid] > nums[left])
left = mid + 1;
else {
right = mid;
}
}
return nums[left];
}
};
2. 旋转数组中有重复数字
题目分析:
有重复数组,比如[1, 0, 1, 1, 1]和[1, 1, 1, 0, 1]这种情况,left、mid、right三者相等,无从判断。
对应有重复数字的处理,left++。
直接上代码:
class Solution {
public:
int findMin(vector<int>& nums) {
int left, right, mid;
left = 0;
right = nums.size() - 1;
while (left < right && nums[left] >= nums[right]) {
if (right - left == 1)
return nums[right];
mid = (left + right) / 2;
if (nums[left] < nums[mid]) {
left = mid + 1;
} else if (nums[left] > nums[mid]){
right = mid;
} else {
++ left;
}
}
return nums[left];
}
};