classSolution { public: intminNumberInRotateArray(vector<int> rotateArray){ int n = rotateArray.size(); if (n == 0) return0; if (n == 1) return rotateArray[0]; for (int i = 0; i < n - 1; i ++) { if (rotateArray[i] > rotateArray[i + 1]) return rotateArray[i + 1]; } return rotateArray[0]; // 说明整个数组都是非递减的 } };
/* 二分 */ classSolution { public: intminNumberInRotateArray(vector<int> rotateArray){ int n = rotateArray.size(); if (n == 0) return0;
int l = 0, r = n - 1; while (l < r) { int mid = l + (r - l) / 2; if (rotateArray[mid] < rotateArray[r]) r = mid; // 说明右边有序,向左走 elseif (rotateArray[mid] == rotateArray[r]) r = r - 1; // 特例:只能一个一个判断 else l = mid + 1; }
时间复杂度:O(logn) */ classSolution { public: intminNumberInRotateArray(vector<int> nums){ int n = nums.size() - 1; if (n < 0) return-1; while (n > 0 && nums[n] == nums[0]) n --; if (nums[n] >= nums[0]) return nums[0];
int l = 0, r = n; while (l < r) { int mid = l + r >> 1; // nums[0],不是 nums[l] if (nums[mid] < nums[0]) r = mid; // 说明左边乱序,向左走 else l = mid + 1; // 说明左边有序,向右走 }
classSolution { public: intminArray(vector<int>& nums){ if (nums.size() == 0) return0;
int l = 0, r = nums.size() - 1; while (l < r) { int mid = l + r >> 1; if (nums[mid] < nums[r]) r = mid; // 右边有序,向左走 elseif (nums[mid] == nums[r]) r = r - 1; // 特例:只能一个个判断 else l = mid + 1; // 右边无序,向右走 }
时间复杂度:O(logn) */ classSolution { public: intminArray(vector<int>& nums){ int n = nums.size() - 1; if (n < 0) return-1; while (n > 0 && nums[n] == nums[0]) n --; if (nums[n] >= nums[0]) return nums[0];
int l = 0, r = n; while (l < r) { int mid = l + r >> 1; if (nums[mid] < nums[0]) r = mid; // 说明右边乱序,向左走 else l = mid + 1; // 说明左边有序,向右走 } return nums[r]; } };