题目链接
leetcode
题目描述
已知一个长度为 n
的数组,预先按照升序排列,经由 1
到 n
次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7]
在变化后可能得到:
- 若旋转
4
次,则可以得到 [4,5,6,7,0,1,2]
- 若旋转
7
次,则可以得到 [0,1,2,4,5,6,7]
注意,数组 [a[0], a[1], a[2], ..., a[n-1]]
旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]]
。
给你一个元素值 互不相同 的数组 nums
,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。
设计一个时间复杂度为 O(log n)
的算法解决此问题。
C++ 代码
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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| #include <iostream> #include <vector> using namespace std;
class Solution { public: int findMin(vector<int>& nums) { if (nums.empty()) { return -1; } if (nums.back() >= nums[0]) { return nums[0]; }
int left = 0, right = nums.size()-1; while (left < right) { int mid = left + (right - left) / 2;
if (nums[mid] < nums[right]) { right = mid; } else { left = mid + 1; } }
return nums[right]; } };
void printArray(const vector<int>& nums) { cout << "["; for (size_t i = 0; i < nums.size(); i++) { cout << nums[i]; if (i != nums.size() - 1) cout << ","; } cout << "]"; }
int main() { Solution solution; vector<vector<int>> nums_cases = { {3,4,5,1,2}, {4,5,6,7,0,1,2}, {11,13,15,17} };
for (size_t i = 0; i < nums_cases.size(); i++) { auto& nums = nums_cases[i];
cout << "Input: nums = "; printArray(nums); cout << endl; int result = solution.findMin(nums); cout << "Output: " << result << endl; }
return 0; }
|