Cover image for 面试经典150题 P33 搜索旋转排序数组

面试经典150题 P33 搜索旋转排序数组


时间轴

时间轴

2025-12-04

init

分治

题目:

二分本质是排除掉另一半:

  • 如果左半边是递增的且 target 不处于这个区间,那么 target 必定在右半边
  • 如果右半边是递增的且 target 不处于这个区间,那么 target 必定在左半边
123456789101112131415161718192021222324252627282930313233343536
#include <vector>using std::vector;class Solution {    public:        int search(vector<int> &nums, int target)        {                int n = nums.size();                int left = 0, right = n - 1;                int mid;                while (left <= right) {                        mid = left + (right - left) / 2;                        if (nums[mid] == target) {                                return mid;                        }                        if (nums[left] <= nums[mid]) {                                if (nums[left] <= target &&                                    target < nums[mid]) {                                        right = mid - 1;                                } else {                                        left = mid + 1;                                }                        }else if (nums[right] >= nums[mid]) {                                if (nums[mid] < target &&                                    target <= nums[right]) {                                        left = mid + 1;                                } else {                                        right = mid - 1;                                }                        }                }                return -1;        }};

leetcode hot 100 rewrite

1234567891011121314151617181920212223242526272829303132333435363738394041
#include <vector>using std::vector;class Solution {    public:        int search(vector<int> &nums, int target)        {                // 1 <= nums.length <= 5000                // -104 <= nums[i] <= 104                // nums 中的每个值都 独一无二                // 题目数据保证 nums 在预先未知的某个下标上进行了旋转                // -104 <= target <= 104                int n = nums.size();                int left = 0, right = n - 1, mid;                while (left <= right) {                        mid = left + (right - left) / 2;                        if (target == nums[mid])                                return mid;                        if (nums[mid] < nums[right]) {                                if (target > nums[mid] && target <= nums[right]) // 在正序段左侧                                        left = mid + 1;                                else                                        right = mid - 1;                        } else { // 在逆序段                                if (target < nums[mid] && target >= nums[left]) // 在逆序段左侧                                        right = mid - 1;                                else                                        left = mid + 1;                        }                }                return -1;        }};
评论加载中…