-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFindMinimumInRotatedSortedArrayII.cpp
More file actions
55 lines (51 loc) · 1.25 KB
/
FindMinimumInRotatedSortedArrayII.cpp
File metadata and controls
55 lines (51 loc) · 1.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Solution {
public:
int find_linear(vector<int>&nums, int left_bound, int right_bound){
int min = nums[left_bound];
for(int i=left_bound+1; i<=right_bound; i++)
if(nums[i] < min)
min = nums[i];
return min;
}
int findMin(vector<int>& nums) {
int left_bound = 0;
int right_bound = nums.size()-1;
if(nums[0] == nums[nums.size()-1]){
int lb = left_bound;
int rb = right_bound;
while(lb < rb && nums[lb] == nums[0] && nums[rb] == nums[0]){ // 退化为O(N)了竟然也能ac
lb++;
rb--;
}
if(lb == rb){
return nums[0]>nums[lb]?nums[lb]:nums[0];
} else if(lb > rb){
return nums[0];
} else{
left_bound = lb;
right_bound = rb;
}
}
while(right_bound - left_bound > 5){
int bound = left_bound + (right_bound-left_bound)/2;
int mid = nums[bound];
if(mid <= nums[right_bound]){
right_bound = bound;
} else if(mid >= nums[left_bound]){
left_bound = bound;
}
}
int min = find_linear(nums, left_bound, right_bound);
return min>nums[0]?nums[0]:min;
}
};
int main(int argc, char *argv[]) {
vector<int> nums{3, 1};
Solution sol;
cout << sol.findMin(nums) << endl;
return 0;
}