# LeetCode : 0153. Find Minimum in Rotated Sorted Array (array)
###### tags:`leetcode`
```
#include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <unordered_map>
using std::vector;
using std::unordered_map;
using namespace std;
class BaseVectorPrint {
public:
void BasePrint00(vector<int>& num) {
for (size_t i = 0; i < num.size(); ++i) {
cout << "[" <<num.at(i) << "]" << "; ";
}
cout << endl;
}
void BasePrint01(vector<int>& num) {
for (size_t i = 0; i < num.size(); ++i) {
cout << num[i] << "; ";
}
cout << endl;
}
void BasePrint02(vector<int>& num) {
for (const auto &item : num) {
cout << item << "; ";
}
cout << endl;
}
void TwoDimensionalPrint(vector<vector<int>> &num){
for (int i = 0; i < num.size(); i++)
{
for (int j = 0; j < num[i].size(); j++)
{
cout << "[" << num[i][j] << "]";
}
cout << endl;
}
}
};
class Solution01 {
public:
int findMin(vector<int>& nums) {
return searchMin(nums, 0, (int)nums.size() - 1);
}
int searchMin(vector<int>& nums, int start, int end) {
if (start == end) return nums[start];
if (nums[start] < nums[end]) return nums[start];
int mid = (start + end) / 2;
// new mid
// left and right min check
return min(searchMin(nums, start, mid), searchMin(nums, mid + 1, end));
}
//time complexity O(logN)
//space complexity O(1)
};
class Solution02 {
public:
int findMin(vector<int>& nums) {
int left = 0;
int right = nums.size()-1;
while(left < right){
printf("Next Run\n");
int mid = (left + right) / 2;
printf("mid = %d\n",mid);
if (nums[mid] > nums[right]) {
left = mid + 1;
}
else if (nums[mid] > nums[left]) {
right = mid - 1;
}
else if (nums[mid] < nums[right]) {
right = mid;
}
else if (nums[mid] < nums[left]) {
left = mid;
}
}
return nums[left];
//how to build selection first
//1. set selection
/*
while(left < right){ // left == right == mid it leave selection
int mid = (left + right) / 2;
// add any state
if (nums[mid] > nums[right]) {
}
else if (nums[mid] > nums[left]) {
}
else if (nums[mid] < nums[right]) {
}
else if (nums[mid] < nums[left]) {
}
}
return nums[left];
*/
//2. add edge leave selection
/*
while(left < right){
int mid = (left + right) / 2;
//add move left or mid or right
if (nums[mid] > nums[right]) {
left = mid + 1;
}
else if (nums[mid] > nums[left]) {
right = mid - 1;
}
else if (nums[mid] < nums[right]) {
right = mid;
}
else if (nums[mid] < nums[left]) {
left = mid;
}
}
return nums[left];
*/
}
//time complexity O(logN)
//space complexity O(1)
};
int main(void)
{
BaseVectorPrint printVector;
Solution02 runfunc;
vector<int> test01 = {3,4,5,1,2};
// sampel run;
// first
vector<int> test02 = {4,5,6,7,0,1,2};
vector<int> test03 = {11,13,15,17};
vector<int> ans ;
int intans;
intans = runfunc.findMin(test02);
//printVector.BasePrint00(ans);
printf("%d\n",intans);
printf("test\n");
system("pause");
}
```
> tip check selection
> tip set selection move state (left mid right)