转载请注明出处: http://www.cnblogs.com/gufeiyang
个人微博:flysea_gu
题目描述:
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
For example,
Consider the following matrix:
[
  [1,   4,  7, 11, 15],
  [2,   5,  8, 12, 19],
  [3,   6,  9, 16, 22],
  [10, 13, 14, 17, 24],
  [18, 21, 23, 26, 30]
]
Given target = 5, return true.
Given target = 20, return false.
思路: 单调的矩阵-->二分筛选
<1> 砍上 二分右列 从上到下找到第一个比target大的
<2> 砍下 二分左列 从下到上找到第一个比target小的
<3> 砍左 二分下行 从左到右找到第一个比target大的
<4> 砍右 二分上行 从右到左找到第一个比target小的
具体代码:
class Solution(object):
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        n = len(matrix)
        if n==0:
            return False
        m = len(matrix[0])
        if m==0:
            return False
        lr = 0
        lc = 0
        rr = n-1
        rc = m-1
        while lr<=rr and lc<=rc:
            l = lr
            r = rr
            while l<=r:
                k = (l+r)/2
                if matrix[k][rc] == target:
                    return True
                elif matrix[k][rc] < target:
                    l = k+1
                else: r = k-1
            if l >= n:
                return False
            lr = l
            
            l = lr
            r = rr
            while l<=r:
                k = (l+r)/2
                if matrix[k][lc] == target:
                    return True
                elif matrix[k][lc] < target:
                    l = k+1
                else: r = k-1
            if r <0 :
                return False
            rr = r
            
            l = lc
            r = rc
            while l<=r:
                k = (l+r)/2
                if matrix[rr][k] == target:
                    return True
                elif matrix[rr][k] < target:
                    l = k+1
                else : r = k-1
            if l>=m:
                return False
            lc = l
            
            l = lc
            r = rc
            while l<=r:
                k = (l+r)/2
                if matrix[lr][k] == target:
                    return True
                elif matrix[lr][k] < target:
                    l = k+1
                else : r = k-1
            if r<0:
                return False
            rc = r
        return False
LeetCode 240. Search a 2D Matrix II
原文:http://www.cnblogs.com/gufeiyang/p/5203393.html