跳到主要内容

81.搜索旋转排序数组II

链接:81.搜索旋转排序数组II
难度:Medium
标签:数组、二分查找
简介:给你 旋转后 的数组 nums 和一个整数 target ,请你编写一个函数来判断给定的目标值是否存在于数组中。

题解 1 - typescript

  • 编辑时间:2021-04-07
  • 执行用时:84ms
  • 内存消耗:39.8MB
  • 编程语言:typescript
  • 解法介绍:先获取偏移值再进行二分查找。
function search(nums: number[], target: number): boolean {
const len = nums.length;
let k = 1;
for (; k < len; k++) if (nums[k - 1] > nums[k]) break;
const find = (start: number, end: number): boolean => {
if (start > end) return false;
const mid = ~~((start + end) / 2);
const num = nums[(mid + k) % len];
if (num > target) return find(start, mid - 1);
else if (num < target) return find(mid + 1, end);
else return true;
};
return find(0, len - 1);
}

题解 2 - typescript

  • 编辑时间:2021-07-23
  • 执行用时:80ms
  • 内存消耗:39.4MB
  • 编程语言:typescript
  • 解法介绍:二分查找。
function search(nums: number[], target: number): boolean {
let l = 0;
let r = nums.length - 1;
if (nums[l] === target || nums[r] === target) return true;
while (l < r) {
while (l < r && nums[l] !== target && nums[l] === nums[r]) {
l++;
r--;
}
if (nums[l] === target || nums[r] === target) return true;
const mid = (r + l) >> 1;
const midNum = nums[mid];
if (midNum === target) return true;
if (midNum <= nums[r]) {
if (midNum <= target && target <= nums[r]) l = mid + 1;
else r = mid - 1;
} else {
if (nums[l] <= target && target <= midNum) r = mid - 1;
else l = mid + 1;
}
}
return false;
}