-
Notifications
You must be signed in to change notification settings - Fork 1
/
81.search-in-rotated-sorted-array-ii.py
78 lines (75 loc) · 2.14 KB
/
81.search-in-rotated-sorted-array-ii.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#
# @lc app=leetcode id=81 lang=python3
#
# [81] Search in Rotated Sorted Array II
#
# https://leetcode.com/problems/search-in-rotated-sorted-array-ii/description/
#
# algorithms
# Medium (35.72%)
# Likes: 5954
# Dislikes: 840
# Total Accepted: 503.5K
# Total Submissions: 1.4M
# Testcase Example: '[2,5,6,0,0,1,2]\n0'
#
# There is an integer array nums sorted in non-decreasing order (not
# necessarily with distinct values).
#
# Before being passed to your function, nums is rotated at an unknown pivot
# index k (0 <= 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,4,4,5,6,6,7] might be rotated at pivot index 5 and become
# [4,5,6,6,7,0,1,2,4,4].
#
# Given the array nums after the rotation and an integer target, return true if
# target is in nums, or false if it is not in nums.
#
# You must decrease the overall operation steps as much as possible.
#
#
# Example 1:
# Input: nums = [2,5,6,0,0,1,2], target = 0
# Output: true
# Example 2:
# Input: nums = [2,5,6,0,0,1,2], target = 3
# Output: false
#
#
# Constraints:
#
#
# 1 <= nums.length <= 5000
# -10^4 <= nums[i] <= 10^4
# nums is guaranteed to be rotated at some pivot.
# -10^4 <= target <= 10^4
#
#
#
# Follow up: This problem is similar to Search in Rotated Sorted Array, but
# nums may contain duplicates. Would this affect the runtime complexity? How
# and why?
#
#
# @lc code=start
class Solution:
def search(self, nums: List[int], target: int) -> bool:
left, right = -1, len(nums)
while left + 1 != right:
mid = (left + right) // 2
if nums[mid] == target:
return True
if nums[mid] == nums[left + 1]:
left += 1
elif nums[mid] > nums[left + 1]:
if nums[left + 1] <= target < nums[mid]:
right = mid
else:
left = mid
else:
if nums[mid] < target <= nums[right - 1]:
left = mid
else:
right = mid
return False
# @lc code=end