题目超链接
class Solution:
def search(self, nums: List[int], target: int) -> int:
if not nums: return -1
n = len(nums)
left, right = 0, n-1
# 将数组一分为二,肯定为一部分有序,一部分无序,在有序部分进行查找target,没有的话则进行下一次二分
while left <= right:
mid = (left + right) // 2
if nums[left] <= nums[mid]: # 有序部分为left-mid区间
if nums[left] <= target <= nums[mid]: # target在有序部分
return self.binarysearch(nums, left, mid+1, target)
else:
left = mid + 1
else: # 有序部分为mid - right 区间
if nums[mid] <= target <= nums[right]:
return self.binarysearch(nums, mid, right+1, target)
else:
right = mid - 1
return -1
def binarysearch(self, nums, left, right, target):
while left <= right:
mid = (left + right) // 2
if nums[mid] == target: return mid
elif nums[mid] > target:
right = mid - 1
else:
left = mid + 1
return -1
class Solution:
def search(self, nums: List[int], target: int) -> int:
if not nums: return False
n = len(nums)
left, right = 0, n-1
# 将数组一分为二,肯定为一部分有序,一部分无序,在有序部分进行查找target,没有的话则进行下一次二分
while left <= right:
while left < right and nums[left] == nums[left+1]: left += 1
while left < right and nums[right] == nums[right-1]: right -= 1
mid = (left + right) // 2
if nums[mid] == target: return True
if nums[left] <= nums[mid]: # 有序部分为left-mid区间
if nums[left] <= target < nums[mid]: # target在有序部分
return self.binarysearch(nums, left, mid, target)
else:
left = mid + 1
else: # 有序部分为mid - right 区间
if nums[mid] < target <= nums[right]:
return self.binarysearch(nums, mid, right+1, target)
else:
right = mid - 1
return False
def binarysearch(self, nums, left, right, target):
while left <= right:
mid = (left + right) // 2
if nums[mid] == target: return True
elif nums[mid] > target:
right = mid - 1
else:
left = mid + 1
return False
1 2解法补充:写法相对简单一些,思想一样,较之上面写法多了几次判断
class Solution:
def search(self, nums: List[int], target: int) -> int:
if not nums: return False
n = len(nums)
left, right = 0, n-1
# 将数组一分为二,肯定为一部分有序,一部分无序,在有序部分进行查找target,没有的话则进行下一次二分
while left <= right:
while left < right and nums[left] == nums[left+1]: left += 1
while left < right and nums[right] == nums[right-1]: right -= 1
mid = (left + right) // 2
if nums[mid] == target: return True
if nums[left] <= nums[mid]: # 有序部分为left-mid区间
if nums[left] <= target < nums[mid]: # target在有序部分
right = mid - 1
else:
left = mid + 1
else: # 有序部分为mid - right 区间
if nums[mid] < target <= nums[right]:
left = mid + 1
else:
right = mid - 1
return False
class Solution:
def findMin(self, nums: List[int]) -> int:
if not nums: return False
left, right = 0, len(nums) - 1
while left < right:
mid = (left + right) // 2
if nums[mid] < nums[right]:
right = mid
else:
left = mid + 1
return nums[left]
class Solution:
def findMin(self, nums: List[int]) -> int:
if not nums: return False
left, right = 0, len(nums) - 1
while left < right:
mid = (left + right) // 2
if nums[mid] < nums[right]:
right = mid
elif nums[mid] > nums[right]:
left = mid + 1
else:
right -= 1
return nums[left]