一、数组查找(用二分法:一般求局部极小值、数组部分有序)
例 一个给定的不包含相同元素的整数数组,求它的一个局部最小值(局部极小值的定义是一个值比左右相邻的(如果存在)都小的值)
#复杂度O(logn)
def findmix(A):
length = len(A)
if length < 2:
return 0
left = 0
right = length -1
while left <= right:
if left == right:
return A[left]
mid = (left + right) // 2
if A[mid] < A[mid + 1]:
right = mid
else:
left = mid + 1
leetcode153、154类型同,33、81类型同,154、81有重复,重点去掉mid和right部分末尾重复内容,使其能判断是否单调,可对照看
leetcode153. Find Minimum in Rotated Sorted Array
class Solution:
def findMin(self, nums):
left = 0
right = len(nums)-1
while left <= right:
if left == right:
return nums[left]
mid = (left + right) // 2
if nums[mid] > nums[right]:
left = mid + 1
else:
right = mid
leetcode154. Find Minimum in Rotated Sorted Array II
class Solution:
def findMin(self, nums):
left = 0
right = len(nums)-1
while left <= right:
if left == right:
return nums[left]
mid = (left + right) // 2
while mid < right and nums[mid] == nums[right]:
right -= 1
if nums[mid] <= nums[right]:
right = mid
else:
left = mid + 1
leetcode33. Search in Rotated Sorted Array
#O(logn)重点:先判断mid对应值是否等于target,然后通过判断mid和right对应值的大小判断
#哪一段是单调的,进而分别判断这个数是否在这一段中,进行取半操作
class Solution:
def search(self, nums, target):
left = 0
right = len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] == target:
return mid
if nums[mid] < nums[right]:
if