leetcode33题解

2026-02-04

Leetcode 33

题干

33. Search in Rotated Sorted Array

Solved

Medium

Topics

premium lock iconCompanies

There is an integer array nums sorted in ascending order (with distinct values).

Prior to being passed to your function, nums is possibly left rotated at an unknown index k (1 <= k < nums.length) such that the resulting array is [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]] (0-indexed). For example, [0,1,2,4,5,6,7] might be left rotated by 3 indices and become [4,5,6,7,0,1,2].

Given the array nums after the possible rotation and an integer target, return the index of target if it is in nums, or -1 if it is not in nums.

You must write an algorithm with O(log n) runtime complexity.

Example 1:

Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4

Example 2:

Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1

Example 3:

Input: nums = [1], target = 0
Output: -1

Constraints:

  • 1 <= nums.length <= 5000
  • -104 <= nums[i] <= 104
  • All values of nums are unique.
  • nums is an ascending array that is possibly rotated.
  • -104 <= target <= 104

题解

我至今仍未知晓,O(n)算法带来了什么样的区别。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        for ( int i=0;i < nums.size();i++){
            if(nums[i]==target) return i;
        }
        return -1;
    }
};// 这个算法 时间击败了100%
可以看看这个奥[LeetCode 题解 33. 搜索旋转排序数组 - 知乎](https://zhuanlan.zhihu.com/p/91928290)
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int lo = 0, hi = nums.size() - 1;
        while (lo < hi) {
            int mid = (lo + hi) / 2;
            if ((nums[0] > target) ^ (nums[0] > nums[mid]) ^ (target > nums[mid]))
                lo = mid + 1;
            else
                hi = mid;
        }
        return lo == hi && nums[lo] == target ? lo : -1;
    }
};

这个代码让我回忆起了计算机网络当中的滑动窗口的内容,就是那个全双工的 滑动窗口协议