81. 搜索旋转排序数组 II
已知存在一个按非降序排列的整数数组 nums
,数组中的值不必互不相同。
在传递给函数之前,nums
在预先未知的某个下标 k
(0 <= k < nums.length
)上进行了 旋转 ,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]
(下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7]
在下标 5
处经旋转后可能变为 [4,5,6,6,7,0,1,2,4,4]
。
给你 旋转后 的数组 nums
和一个整数 target
,请你编写一个函数来判断给定的目标值是否存在于数组中。如果 nums
中存在这个目标值 target
,则返回 true
,否则返回 false
。
你必须尽可能减少整个操作步骤。
示例 1:
输入:nums = [2,5,6,0,0,1,2]
, target = 0
输出:true
示例 2:
输入:nums = [2,5,6,0,0,1,2]
, target = 3
输出:false
提示:
1 <= nums.length <= 5000
-104 <= nums[i] <= 104
nums
在预先未知的某个下标上进行了旋转-104 <= target <= 104
进阶:
nums
可能包含重复元素。
相似题目
原站题解
c 解法, 执行用时: 4 ms, 内存消耗: 6.6 MB, 提交时间: 2023-09-24 18:28:08
bool search(int* nums, int numsSize, int target) { if (numsSize == 0) { return false; } if (numsSize == 1) { return nums[0] == target; } int l = 0, r = numsSize - 1; while (l <= r) { int mid = (l + r) / 2; if (nums[mid] == target) { return true; } if (nums[l] == nums[mid] && nums[mid] == nums[r]) { ++l; --r; } else if (nums[l] <= nums[mid]) { if (nums[l] <= target && target < nums[mid]) { r = mid - 1; } else { l = mid + 1; } } else { if (nums[mid] < target && target <= nums[numsSize - 1]) { l = mid + 1; } else { r = mid - 1; } } } return false; }
javascript 解法, 执行用时: 60 ms, 内存消耗: 41.2 MB, 提交时间: 2023-09-24 18:27:49
/** * @param {number[]} nums * @param {number} target * @return {boolean} */ var search = function(nums, target) { const n = nums.length; if (n === 0) { return false; } if (n === 1) { return nums[0] === target; } let l = 0, r = n - 1; while (l <= r) { const mid = Math.floor((l + r) / 2); if (nums[mid] === target) { return true; } if (nums[l] === nums[mid] && nums[mid] === nums[r]) { ++l; --r; } else if (nums[l] <= nums[mid]) { if (nums[l] <= target && target < nums[mid]) { r = mid - 1; } else { l = mid + 1; } } else { if (nums[mid] < target && target <= nums[n - 1]) { l = mid + 1; } else { r = mid - 1; } } } return false; };
python3 解法, 执行用时: 36 ms, 内存消耗: 16.4 MB, 提交时间: 2023-09-24 18:27:31
class Solution: def search(self, nums: List[int], target: int) -> bool: if not nums: return False n = len(nums) if n == 1: return nums[0] == target l, r = 0, n - 1 while l <= r: mid = (l + r) // 2 if nums[mid] == target: return True if nums[l] == nums[mid] and nums[mid] == nums[r]: l += 1 r -= 1 elif nums[l] <= nums[mid]: if nums[l] <= target and target < nums[mid]: r = mid - 1 else: l = mid + 1 else: if nums[mid] < target and target <= nums[n - 1]: l = mid + 1 else: r = mid - 1 return False
golang 解法, 执行用时: 4 ms, 内存消耗: 3 MB, 提交时间: 2023-09-24 18:27:18
func search(nums []int, target int) bool { n := len(nums) if n == 0 { return false } if n == 1 { return nums[0] == target } l, r := 0, n-1 for l <= r { mid := (l + r) / 2 if nums[mid] == target { return true } if nums[l] == nums[mid] && nums[mid] == nums[r] { l++ r-- } else if nums[l] <= nums[mid] { if nums[l] <= target && target < nums[mid] { r = mid - 1 } else { l = mid + 1 } } else { if nums[mid] < target && target <= nums[n-1] { l = mid + 1 } else { r = mid - 1 } } } return false }
java 解法, 执行用时: 0 ms, 内存消耗: 41.8 MB, 提交时间: 2023-09-24 18:27:05
class Solution { public boolean search(int[] nums, int target) { int n = nums.length; if (n == 0) { return false; } if (n == 1) { return nums[0] == target; } int l = 0, r = n - 1; while (l <= r) { int mid = (l + r) / 2; if (nums[mid] == target) { return true; } if (nums[l] == nums[mid] && nums[mid] == nums[r]) { ++l; --r; } else if (nums[l] <= nums[mid]) { if (nums[l] <= target && target < nums[mid]) { r = mid - 1; } else { l = mid + 1; } } else { if (nums[mid] < target && target <= nums[n - 1]) { l = mid + 1; } else { r = mid - 1; } } } return false; } }
cpp 解法, 执行用时: 8 ms, 内存消耗: 14.1 MB, 提交时间: 2023-09-24 18:26:47
class Solution { public: bool search(vector<int> &nums, int target) { int n = nums.size(); if (n == 0) { return false; } if (n == 1) { return nums[0] == target; } int l = 0, r = n - 1; while (l <= r) { int mid = (l + r) / 2; if (nums[mid] == target) { return true; } if (nums[l] == nums[mid] && nums[mid] == nums[r]) { ++l; --r; } else if (nums[l] <= nums[mid]) { if (nums[l] <= target && target < nums[mid]) { r = mid - 1; } else { l = mid + 1; } } else { if (nums[mid] < target && target <= nums[n - 1]) { l = mid + 1; } else { r = mid - 1; } } } return false; } };