阶梯训练3-二分查找II
Posted zlldt
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阶梯训练3-二分查找II相关的知识,希望对你有一定的参考价值。
60. 搜索插入位置
给定一个排序数组和一个目标值,如果在数组中找到目标值则返回索引。如果没有,返回到它将会被按顺序插入的位置。
你可以假设在数组中无重复元素。
样例
[1,3,5,6],5 → 2
[1,3,5,6],2 → 1
[1,3,5,6], 7 → 4
[1,3,5,6],0 → 0
还是用二分查找的代码,只是在判断的时候,加入:
如果数组长度为0或者target小于数组第一个元素,返回0,
如果target大于数组最后一个元素,返回length,
length = len(A)
if length == 0:
return 0
if target<A[0]:
return 0
if target>A[length-1]:
return length
二分查找完之后,
如果target小于left位置的值,返回left位置,
如果target大于right位置的值,返回right+1,
否则返回right位置,
elif target<A[left] :
return left
elif target>A[right] :
return right+1
else :
return right
return 0
运行结果:
代码:
28. 搜索二维矩阵
写出一个高效的算法来搜索 m × n矩阵中的值。
这个矩阵具有以下特性:
每行中的整数从左到右是排序的。
每行的第一个数大于上一行的最后一个整数。
思路:先在第一列进行二分查找,如果找到target,返回True,如果没找到,返回可能包含该数的行数,再在该行进行二分查找。
矩阵为空,返回False,
if matrix ==[]:
return False
如果target小于最小值或者大于最大值,返回False,
height = len(matrix)
width = len(matrix[0])
if target < matrix[0][0] or target > matrix[height-1][width-1]:
return False
取第一列,进行二分查找,
col0 = []
for i in range(height):
col0.append(matrix[i][0])
found,linenumber = self.bin_search(col0,target)
如果找到target,返回True,否则在目标行再二分查找。
if found == True:
return True
found,_ = self.bin_search(matrix[linenumber],target)
return found
二分查找也要稍作修改:
def bin_search(self, data_list, target):
low, high = 0, len(data_list)-1
while low + 1 < high:
mid = (low + high) // 2
if data_list[mid] < target:
low = mid
else:
high = mid
如果找到目标,返回True,
if data_list[low] == target or data_list[high] == target:
return True, 0
如果target大于第high行第一个值,则在high行进行二分查找,否则在low行进行二分查找,
elif data_list[high] < target:
return False, high
elif data_list[low] < target:
return False, low
运行结果:
代码:
以上是关于阶梯训练3-二分查找II的主要内容,如果未能解决你的问题,请参考以下文章
[LeetCode] 240. 搜索二维矩阵 II ☆☆☆(二分查找类似)