Leetcode 刷题笔记 binary search(rotated sorted Array)
idea:
- 基本模板
l = 0
r = len(nums) -1
while l <= r:
mid = (l + r) // 2
...
- 假设左边有序找target
- 假设右边有序找target
*** 若有重复可以将l更新至 mid + 1
while nums[l] == nums[mid] #[l,1,1,1, mid,2,3]
(rotated sorted Array) 81. Search in Rotated Sorted Array II (medium)
https://leetcode.com/problems/search-in-rotated-sorted-array-ii/
class Solution:
def search(self, nums: List[int], target: int) -> bool:
l = 0
r = len(nums) - 1
while l <= r:
mid = (l + r) // 2
if nums[mid] == target:
return True
elif nums[l] == nums[mid]:
l += 1
# left in order
elif nums[l] < nums[mid]:
if nums[l] <= target <nums[mid]:
r = mid - 1
else:
l = mid + 1
else:
if nums[r] >= target > nums[mid]:
l = mid + 1
else:
r = mid - 1
return False
(rotated sorted Array) 154. Find Minimum in Rotated Sorted Array II (hard)
https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/
class Solution:
def findMin(self, nums: List[int]) -> int:
l = 0
r = len(nums) - 1
rst = nums[l]
while l <= r:
mid = (l + r) // 2
#[1,1,1,1,1,1,3,4]
if nums[l] == nums[mid] and l <= r:
rst = min(rst, nums[mid])
l += 1
continue
#left in order
if l > r:
break
if nums[l] < nums[mid]:
rst = min(nums[l],rst)
l = mid + 1
else: #nums[l] > nums[mid]
rst = min(nums[mid],rst)
r = mid - 1
return rst
(rotated sorted Array) 33. Search in Rotated Sorted Array(medium)
https://leetcode.com/problems/search-in-rotated-sorted-array/
class Solution:
def search(self, nums: List[int], target: int) -> int:
l = 0
r = len(nums) - 1
while l <= r:
mid = (l + r) // 2
if nums[mid] == target:
return mid
elif nums[l] <= nums[mid]:
if nums[l] <= target < nums[mid]:
r = mid - 1
else:
l = mid + 1
else:
if nums[r] >= target > nums[mid]:
l = mid + 1
else:
r = mid - 1
return -1