题目
Suppose an array sorted in ascending order 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.
找到最小元素,可以假定数组中不存在重复。
分析
其实这就是一个循环有序数组,循环有序数组就是将一个有序数组切成两段,并交换位置。
一个循环有序数组的最小元素就是其分界点,且一个循环有序数组从中间位置一分两半,可得到一个循环数组和一个有序数组。这样一来,主要的思路就是通过左边界元素和中间元素的大小关系判断循环部分在哪半边。
- 当左边界元素 > 中间元素,左边元素有序,循环部分在左半边。
- 当左边界元素 < 中间元素,左边元素有序,循环部分在右半边。
在判断该部分为循环部分时,发现其也为有序部分,该部分的起始值就是最小元素。
代码
#include <iostream>
#include <vector>
using namespace std ;
class Solution {
public:
int findMin(vector<int>& nums) {
int start = 0, end = nums.size() - 1;
while (start < end) {
if (nums[start] < nums[end])
return nums[start];
int mid = (start + end) / 2;
if (nums[mid] < nums[start]) {
end = mid;
} else {
start = mid + 1;
}
}
return nums[start];
}
};
int main() {
Solution solution;
int num[] = {7, 8, 1, 2, 3, 4, 5, 6};
int length = sizeof(num) / sizeof(int);
vector<int> nums(num, num + length);
int min = solution.findMin(nums);
cout << min << " is the smallest in array." << endl;
return 0;
}
参考资料
CSDN 博客:http://blog.csdn.net/linhuanmars/article/details/40449295
LeetCode 讨论:https://discuss.leetcode.com/topic/4100/compact-and-clean-c-solution