Find Minimum in Rotated Sorted Array II (leetcode)

来源:互联网 发布:考级电子琴品牌 知乎 编辑:程序博客网 时间:2024/06/16 06:37

题目:

Follow up for "Find Minimum in Rotated Sorted Array":
What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

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.

The array may contain duplicates.

题目来源:https://oj.leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/

解题思路:如果中间值和两端值不相等,则直接利用上题的思路解即可,如果相等,则需要递归求解,分别求出左半部分和有半部分的最小值,然后返回两者的最小值,在findMin1中即是用的这种思路,在这里代码用了vector的构造函数完成拷贝,其实可以重新写一个计算,可以把拷贝时间节省下来。FindMin函数中当有相等值时,就把左右元素都去掉,重新找最小值,但是这个如果数组中元素全部相同,则退化到了O(n)复杂度。

#include<iostream>#include<vector>using namespace std;int findMin(vector<int> &num){if(num.empty())return 0;int mid=0,first=0,last=num.size()-1;while(first!=last && first+1!=last){mid=first+((last-first)>>1);if(num[first]==num[mid] && num[last]==num[mid]){first++;last--;continue;}if(num[first]>num[mid])last=mid;else if(num[mid]>num[last])first=mid;elsereturn num[first];}if(first==last)return num[first];elsereturn min(num[first+1],num[first]);}int findMin1(vector<int> &num){if(num.empty())return 0;int mid=0,first=0,last=num.size()-1;while(first!=last && first+1!=last){mid=first+((last-first)>>1);if(num[first]==num[mid] && num[last]==num[mid]){vector<int>left(num.begin()+first,num.begin()+mid);    vector<int>right(num.begin()+mid+1,num.begin()+last+1);        return min(findMin(left),findMin(right));}if(num[first]>num[mid])last=mid;else if(num[mid]>num[last])first=mid;elsereturn num[first];}if(first==last)return num[first];elsereturn min(num[first+1],num[first]);}int main()  {  const int N=3;int A[N]={3,1,1};vector<int> num(A,A+N);int result=findMin(num);    system("pause");      return 0;  }



0 0
原创粉丝点击