您的位置:首页 > 其它

[LeetCode] Find Minimum in Rotated Sorted Array II

2017-08-10 10:31 281 查看

题目

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. The array may contain duplicates.

找到最小元素。数组可能包含重复项。

分析

其实这就是一个循环有序数组,循环有序数组就是将一个有序数组切成两段,并交换位置。

一个循环有序数组的最小元素就是其分界点,且一个循环有序数组从中间位置一分两半,可得到一个循环数组和一个有序数组。这样一来,主要的思路就是通过左边界元素和中间元素的大小关系判断循环部分在哪半边。

当左边界元素 > 中间元素,左边元素有序,循环部分在左半边。

当左边界元素 < 中间元素,左边元素有序,循环部分在右半边。

当左边界元素 = 中间元素,无法判断,因而移动一位,直到出现大小关系。

在判断该部分为循环部分时,发现其也为有序部分,该部分的起始值就是最小元素。

代码

#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])
break;

int mid = (start + end) / 2;
if (nums[mid] < nums[start]) {
end = mid;
} else if (nums[mid] == nums[start]) {
start++;
} else {
start = mid + 1;
}
}
return nums[start];
}
};

int main() {
Solution solution;
int num[] = {3, 3, 3, 3, 3, 0, 1, 2};
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;
}


参考资料

CSDN 博客:http://blog.csdn.net/linhuanmars/article/details/40449299
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode array