【数组】
二分查找
704.二分查找
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
i = 0
j = len(nums) - 1
while i <= j:
mid = (i + j)//2
if nums[mid] < target:
i = mid + 1
elif nums[mid] > target:
j = mid -1
else:
return mid
return -1
35.搜索插入位置
class Solution(object):
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
i = 0
j = len(nums) - 1
while i<=j:
mid = (i+j)//2
if nums[mid] < target:
i = mid + 1
elif nums[mid] > target:
j = mid - 1
else:
return mid
return j +1
34.在排序数组中查找元素的第一个和最后一个位置
class Solution(object):
def searchRange(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
def searchLeft(nums,target):
i,j = 0,len(nums)-1
while i<=j:
mid = (i+j)//2
if nums[mid] < target:
i = mid + 1
elif nums[mid] > target:
j = mid - 1
else:
if nums[mid - 1] < target or mid == 0:
return mid
else:
j = mid - 1
return -1
def searchRight(nums,target):
i,j = 0,len(nums)-1
while i<=j:
mid = (i+j)//2
if nums[mid] < target:
i = mid + 1
elif nums[mid] > target:
j = mid - 1
else:
if mid == len(nums)-1 or nums[mid + 1] > target:
return mid
else:
i = mid +1
return -1
return [searchLeft(nums, target), searchRight(nums, target)]
备注: 没做出来,看了答案才发现最基础的做法是寻找双边界指针…
69. x的平方根
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
i = 0
j = x
while i <= j:
mid = (i+j) //2
if mid * mid == x:
return mid
elif mid*mid < x :
if (mid+1) *(mid+1) >x:
return mid
elif (mid+1) *(mid+1) <x:
i = mid + 1
else:
return mid + 1
else:
if (mid-1) *(mid-1) == x:
return mid -1
else:
j = mid -1
return 0
367. 有效的完全平方数
class Solution(object):
def isPerfectSquare(self, num):
"""
:type num: int
:rtype: bool
"""
i = 0
j = num
while i <= j:
mid = (i+j) //2
if mid * mid == num:
return True
elif mid*mid < num :
i = mid + 1
else:
j = mid -1
return False
二分查找总结
1、二分查找是一种 时间复杂度为O(logN)的算法,适用于求解在一段序列中寻找某一target的问题
2、二分查找的结果有三种情况。第一种当Target小于nums[0]时,index会收敛到0;当Target大于nums[末尾]时,index会收敛到nums[末尾];当Target在nums的区间范围内时,index会收敛到某一具体值,使得Target落在(nums[index-1],nums[index+1]之中。总而言之,无论是插入还是查找,Target的索引就在index附近,一般是left+1(因为跳出while循坏的时候,[i,j]要不等于[mid+1,mid]这种情况Target索引在(mid,mid+1),要不等于[mid.mid-1]这种情况Target索引在(mid-1,mid))