龙空技术网

leetcode解题笔记:动态规划——33. 搜索旋转排序数组

科技树乱点 335

前言:

眼前咱们对“二分法实现数组排序”都比较关心,各位老铁们都需要剖析一些“二分法实现数组排序”的相关文章。那么小编同时在网上收集了一些关于“二分法实现数组排序””的相关文章,希望各位老铁们能喜欢,姐妹们快快来了解一下吧!

题目地址

解题思路和具体代码

注意,这道题要求时间复杂度为`O(log(n))`,那肯定要用到二分查找法。但是常规的二分查找需要数组是有序排列的,现在题目里的数组并没有完全有序排列。

思路:

查找中间位置。`n = nums.length,start = 0, end = n`,初始中间位置值为`middle = Math.floor((end - start) / 2)`;通过`middle`将数组分为两部分,左边数组为`left = nums.slice(start, middle)`,右边数组为`right = nums.slice(middle)`;左右两边一定有一个是有序排列的;判断target在哪个数组里,缩小范围。

下面是具体代码实现。

function search(nums: number[], target: number): number {  let start = 0;  let end = nums.length - 1;  while (start <= end) {    const middle = Math.floor((end + start) / 2);    if (nums[middle] === target) {      return middle;    }    if (nums[start] <= nums[middle]) { // 左边是有序的      if (target >= nums[start] && target < nums[middle]) {        end = middle - 1;      } else {        start = middle + 1;      }    } else { // 右边是有序的      if (target > nums[middle] && target <= nums[end]) {        start = middle + 1;      } else {        end = middle - 1;      }    }  }  return -1;}

标签: #二分法实现数组排序