153.寻找旋转排序数组中的最小值class Solution { public: int findMin(vector<int> &nums) { /*int left = 0, right = nums.size() - 1; while (right >= left) { int mid = left + (right - left) / 2; if (nums[left] > nums[mid]) right = mid; else if (nums[right] < nums[mid]) left = mid + 1; if (nums[left] <= nums[right]) return nums[left]; } return nums[left];*/ // 150/150 cases passed (0 ms) // Your runtime beats 100 % of cpp submissions // Your memory usage beats 78.78 % of cpp submissions (9.9 MB) int left = 0, right = nums.size() - 1; while (right > left) { int mid = left + (right - left) / 2; if (nums[right] > nums[mid]) right = mid; else left = mid + 1; } return nums[left]; // 150/150 cases passed (0 ms) // Your runtime beats 100 % of cpp submissions // Your memory usage beats 80.88 % of cpp submissions (9.9 MB) }}; 162.寻找峰值class Solution { public: /*int findPeakElement(vector<int> &nums) { return find(nums, 0, nums.size() - 1); } int find(vector<int> &nums, int left, int right) { while (right > left) { int mid = left + (right - left) / 2; if (nums[mid] > nums[right] && nums[mid] > nums[left]) { int leftM = find(nums, left, mid); int rightM = find(nums, mid, right); if (leftM == mid) { left = rightM; } else if (rightM == mid) { left = leftM; } else left = leftM; } else if (nums[right] >= nums[left]) left = mid + 1; else if (nums[right] < nums[left]) right = mid - 1; } return left; // 63/63 cases passed (4 ms) // Your runtime beats 67.65 % of cpp submissions // Your memory usage beats 94.96 % of cpp submissions (8.5 MB) }*/ int findPeakElement(vector<int> &nums) { int left = 0, right = nums.size() - 1; while (left < right) { int mid = left + (right - left) / 2; if (nums[mid] > nums[mid + 1]) { right = mid; } else { left = mid + 1; } } return left; } // 63/63 cases passed (0 ms) // Your runtime beats 100 % of cpp submissions // Your memory usage beats 84.49 % of cpp submissions (8.5 MB) //*找规律: //*规律一:如果nums[i] > nums[i+1],则在i之前一定存在峰值元素 //*规律二:如果nums[i] < nums[i+1],则在i+1之后一定存在峰值元素 //(=^=!)};