Skip to content

Commit d3498d9

Browse files
committed
Add 'Find Minimum in Rotated Sorte Array II' solution.
1 parent 174504a commit d3498d9

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

3Sum.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
/*
2+
3Sum
3+
24
Given an array S of n integers, are there elements a, b, c in S such
35
that a + b + c = 0? Find all unique triplets in the array which gives
46
the sum of zero.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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

Comments
 (0)