剑指:排序数组的查找问题

一维有序数组查找

在这里插入图片描述
有序数组的查找问题首选——二分法
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
                   
          





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值