一维有序数组查找
有序数组的查找问题首选——二分法
1.初始化,将双指针指向数组的两端,取i=0,j=len(list),m=(i+j)/2
2.循环二分
若list[m]>list[j],则目标值位于m的右侧区域,此时最小值应在[m+1,j]
若list[m]<list[j],则目标值位于m的左侧区域,此时最小值应在[i,m]
若list[m]==list[j],此时无法判断最小值所在的区域,因此将搜索范围缩小,j=j-1
3.返回值条件,i=j,并返回该点的值
Class Soltuion(object):
def findArray(self, numbers):
"""
:type numbers: List[int]
:rtype: int
"""
i=0
j=len(numbers)
while i<j:
m=(i+j)//2
# 取整
if numbers[m]>numbers[j]:
i=m+1
elif numbers[m]<numbers[j]:
j=m
elif numbers[m]==numbers[j]:
j=j-1
return numbers[i]
二维有序数组的查找
最简单的方法就是暴力解,但耗费时间
根据二维数组的特点,进行旋转,可以发现其类似于搜索二叉树(左子<根<右子),左下和右上是关键节点
1.初始化双指针,i,j
若当前值>target,则当前值[row][column],行向上移动一位,row+1
若当前值<target,则当前值[row][column],列向右移动一位,column+1
若当前值==target,则返回TRUE
若row或column越界,则代表矩阵中没有target,返回False
Class Solution(object):
def findtarget(self,mat,target):
i,j=len(mat)-1,0
while i>0 and j<len(mat[0]):
if mat[i][j]>target:
i=i-1
if mat[i][j]<target:
j=j+1
if mat[i][j]=target:
return True
return False