1
+ /*
2
+ Find Minimum in Rotated Sorted Array II
3
+
4
+ Suppose a sorted array is rotated at some pivot unknown to you beforehand.
5
+ (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
6
+ Find the minimum element.The array may contain duplicates.
7
+ */
8
+
9
+ class Solution {
10
+ public:
11
+ int findSubMin (vector<int > &num, int l, int r) {
12
+ if (l > r) return LONG_MAX;
13
+ if (l == r) return num[l];
14
+
15
+ // Enumerate all relations of num[l] and num[mid], num[mid] and num[r].
16
+ // {num[l]=num[mid], num[l]<num[mid], num[l]>num[mid]} x {num[mid]=num[r], num[mid]<num[r], num[mid]>num[r]}
17
+ // It has 9 conditions, which are redundant.
18
+ // Not to merge synonymic statements in order to improve readability.
19
+ int mid = (l + r) / 2 ;
20
+ if (num[l] == num[mid] && num[mid] == num[r])
21
+ return std::min (num[l], std::min (findSubMin (num, l+1 , mid-1 ), findSubMin (num, mid+1 , r-1 )));
22
+ if (num[l] == num[mid] && num[mid] < num[r]) return num[l];
23
+ if (num[l] == num[mid] && num[mid] > num[r]) return findSubMin (num, mid+1 , r);
24
+ if (num[l] < num[mid] && num[mid] == num[r]) return num[l];
25
+ if (num[l] < num[mid] && num[mid] < num[r]) return num[l];
26
+ if (num[l] < num[mid] && num[mid] > num[r]) return findSubMin (num, mid+1 , r);
27
+ if (num[l] > num[mid] && num[mid] == num[r]) return findSubMin (num, l+1 , mid);
28
+ if (num[l] > num[mid] && num[mid] < num[r]) return findSubMin (num, l+1 , mid);
29
+ if (num[l] > num[mid] && num[mid] > num[r]) return findSubMin (num, mid+1 , r);
30
+ }
31
+
32
+ int findMin (vector<int > &num) {
33
+ return findSubMin (num, 0 , num.size ()-1 );
34
+ }
35
+ };
0 commit comments