Search a 2D Matrix II

原题: https://leetcode.com/problems/search-a-2d-matrix-ii/description/

题意: 编写一个高效的算法,从一个m × n矩阵中寻找一个值。矩阵具有如下性质:

  • 每一行的整数从左向右递增
  • 每一列的整数从上往下递增

约定:(1)

例子: 

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

标签: matrix、2d、ii、递增、search、面试
猜你感兴趣的圈子:
LeetCode交流圈
  • Bingo
    2017-08-18 17:50:24 1楼#1层
    Python解法一:
    class Solution:
        # @param {integer[][]} matrix
        # @param {integer} target
        # @return {boolean}
        def searchMatrix(self, matrix, target):
            y = len(matrix[0]) - 1
            for x in range(len(matrix)):
                while y and matrix[x][y] > target:
                    y -= 1
                if matrix[x][y] == target:
                    return True
            return False
  • Bingo
    2017-08-18 17:51:00 2楼#1层
    Python解法二:
    class Solution:
        # @param {integer[][]} matrix
        # @param {integer} target
        # @return {boolean}
        def searchMatrix(self, matrix, target):
            y = len(matrix[0]) - 1
            def binSearch(nums, low, high):
                while low <= high:
                    mid = (low + high) / 2
                    if nums[mid] > target:
                        high = mid - 1
                    else:
                        low = mid + 1
                return high
            for x in range(len(matrix)):
                y = binSearch(matrix[x], 0, y)
                if matrix[x][y] == target:
                    return True
            return False
  • Bingo
    2017-08-18 17:52:40 3楼#1层
    Java:
    public class Solution {
        public boolean searchMatrix(int[][] matrix, int target) {
            int n=matrix.length, m=matrix[0].length;
            return helper(matrix,0,n-1,0,m-1,target);
        }
        boolean helper(int[][] matrix, int rowStart, int rowEnd, int colStart, int colEnd, int target ){
            if(rowStart>rowEnd||colStart>colEnd){
                return false;
            }
            int rm=(rowStart+rowEnd)/2, cm=(colStart+colEnd)/2;
            if(matrix[rm][cm]== target){
                return true;
            }
            else if(matrix[rm][cm] >target){
                return helper(matrix, rowStart, rm-1,colStart, cm-1,target)||
                    helper(matrix,  rm, rowEnd, colStart,cm-1,target) ||
                    helper(matrix, rowStart, rm-1,cm, colEnd,target);
            }
            else{
                return helper(matrix, rm+1, rowEnd, cm+1,colEnd,target)||
                    helper(matrix,  rm+1, rowEnd, colStart,cm,target) ||
                    helper(matrix, rowStart, rm,cm+1, colEnd,target);
            }
        
    }
  • Bingo
    2017-08-18 17:53:40 4楼#1层
    C++:
    class Solution {
    public:
        bool searchMatrix(vector<vector<int> > &matrix, int target) {
            if (matrix.empty() || matrix[0].empty()) return false;
            if (target < matrix[0][0] || target > matrix.back().back()) return false;
            int x = matrix.size() - 1, y = 0;
            while (true) {
                if (matrix[x][y] > target) --x;
                else if (matrix[x][y] < target) ++y;
                else return true;
                if (x < 0 || y >= matrix[0].size()) break;
            }
            return false;
        }
    };
  • 回复
隐藏