Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

33. 搜索旋转排序数组 #70

Open
Labels
@Geekhyt

Description

原题链接

二分查找

先来看下有序数组的二分查找。

const search = function(nums, target) {
 let start = 0
 let end = nums.length - 1
 while (start <= end) {
 const mid = start + ((end - start) >> 1)
 if (nums[mid] === target) return mid
 if (nums[mid] < target) {
 start = mid + 1
 } else {
 end = mid - 1
 }
 }
 return -1
}
  1. 再来明确,因为本题是旋转数组,我们无法直接根据 nums[mid]target 的关系来定位 target 是在 mid 的左边还是右边
  2. 需要分段处理,先比较 nums[mid]nums[start] 的大小,来定位 mid 在左边还是右边
  3. 继续定位 target,判断 targetmid 的左边还是右边,然后分别调整边界 startend
const search = function(nums, target) {
 let start = 0
 let end = nums.length - 1
 while (start <= end) {
 const mid = start + ((end - start) >> 1)
 if (nums[mid] === target) return mid
 if (nums[mid] >= nums[start]) {
 if (target >= nums[start] && target < nums[mid]) {
 end = mid - 1
 } else {
 start = mid + 1
 }
 } else {
 if (target > nums[mid] && target <= nums[end]) {
 start = mid + 1
 } else {
 end = mid - 1
 }
 }
 }
 return -1
}
  • 时间复杂度:O(logn)
  • 空间复杂度:O(1)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

        AltStyle によって変換されたページ (->オリジナル) /