Saddleback Search

从leetcode看到,具体可见链接
下面是自己的理解和翻译。

设有一待查找的数x和一个二维数组b[0..m-1, 0..n-1](均为整数),每行和每列都是非降序(等于升序?),例子如下,此时m=4,n=4:
这里写图片描述
这里的x假设一定存在于b中,该算法就是从数组b中找到x的位置,因此有条件:
Q: x 存在于b[0..m-1, 0..n-1]中
该算法将结果存于变量h和k中,即:
R: x=b[h,k].

//以下是思考过程(或者废话,可跳过):
首先需要一个循环或递归过程,这里选择循环,然后需要一个循环不变量,这个循环不变量产生于R和Q,为了得出不变量,注意到R可以写成和Q一样的形式,即:
R: x存在于b[h..h,k..k]
Q是说x在一个大的范围内,R是说x在一个小的范围内,也许这个循环不变量P应该说x在一个范围内。重新按R的格式写这个不变量,并且用两个新的变量表示范围:
不变量P: x存在于b[h..i, j..k](这里有意思了,这里潜在的意思是行是从右往左找,列是从上往下找)
于是这个算法就非常简单了,它在最差的情况下运行时间为O(m+n),需要注意和利用的是一开始的条件,该数组,每行和每列都是非降序,即已经排好序了。
//思考过程完毕(废话完毕)

该算法简而言之是这样的:
1.从右上角开始找,即从b[0,n-1]开始找
【注:h,k=0,n-1, P: x存在于b[h..m-1, 0..k]中】
2.如果x大于b[h,k],那么h=h+1
3.如果x小于b[h,k],那么k=k-1
4.如果x匹配,那么返回h和k的值,即为所要查找的位置

注:以上算法并没有考虑x有重复多个值的情况或者x不存在的情况,仅限于x存在于b并且找到一个下标即可。

附leetcode 240 Search a 2D Matrix II code:

python:

class Solution(object):
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        if not len(matrix) or not len(matrix[0]): return False
        n,m,c=0,len(matrix[0])-1,len(matrix)
        while(n<c and m>=0):
            if matrix[n][m]>target: m-=1
            elif matrix[n][m]<target: n+=1
            else: return True
        return False

C++:

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if(matrix.size()==0) return false;
        int n=0,m=matrix[0].size()-1,c=matrix.size();
        while(n<c && m>=0){
            if(matrix[n][m]>target) m-=1;
            else if(matrix[n][m]<target) n+=1;
            else return true;
        }
        return false;
    }
};

纪念第一篇博客诞生撒花~~~~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值