Find Minimum in Rotated Sorted Array

原题(源自:https://oj.leetcode.com/problems/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。

1.直接裸算o(n)可以测试通过,代码如下:

class Solution { public: int findMin(vector<int> &num) { int n = num.size(); for(int i = 0;i < n - 1;i ++) { if(num[i] > num[i+1]) return num[i+1]; } return num[0]; } };
View Code

 

所以原题原意就是2个递增序列合并,注意没有相同元素,很简单。

2.折半查找o(logn)代码如下:

class Solution { public: int findMin(vector<int> &num) { int left = 0; int right = num.size() - 1; while(left < right) { int mid = (left + right)/2; if(num[left] < num[right]) return num[left]; if(num[mid] >= num[left]) { left = mid + 1; } else right = mid; } return num[left]; } };
View Code

大致分析如下:(注意两个递增序列不能交叉重叠,且没有特殊的中间元素所以必有 序列1<序列2或序列1>序列2)

如果 num[left]<=num[mid] && num[mid]<num[right]  则 第一个元素就是所找

如果 num[left]<=num[mid] && num[mid]>num[right]  则 left = mid + 1;

如果 num[left]>  num[mid] && num[mid]<num[right]  则 right = mid;

如果 num[left]>  num[mid] && num[mid]>num[right]  则 不可能;

之后的子情况要么变成一个递增序列,此时就和上面第一种情况是一样的;要么仍然为2个递增序列合并,则和父情况一样。

 

你可能感兴趣的:(array)