阶梯训练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

运行结果:

代码:

阶梯训练3-二分查找II

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 ☆☆☆(二分查找类似)

数组--二分查找 专题训练

牛客Top200---二分查找II

代码随想录算法训练营第一天 | 704. 二分查找27. 移除元素

代码随想录算法训练营第一天 | 704. 二分查找27. 移除元素