240. Search a 2D Matrix II

240 Search a 2D Matrix II

Total Accepted: 39652 Total Submissions: 113403 Difficulty: Medium

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

Integers in each row are sorted in ascending from left to right.
Integers in each column are sorted in ascending from top to bottom.

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.

Hide Company Tags Amazon Google Apple
Hide Tags Binary Search Divide and Conquer
Hide Similar Problems (M) Search a 2D Matrix

思路:##

We start search the matrix from top right corner, initialize the current position to top right corner, if the target is greater than the value in current position, then the target can not be in entire row of current position because the row is sorted, if the target is less than the value in current position, then the target can not in the entire column because the column is sorted too. We can rule out one row or one column each time, so the time complexity is O(m+n).

Runtime: 13 ms beat 52%

public class Solution {
      /* https://leetcode.com/discuss/48852/my-concise-o-m-n-java-solution

        */
    public boolean searchMatrix(int[][] matrix, int target) {
        
        if (matrix == null || matrix.length < 1 || matrix[0].length < 1) {
            return false;
        }
        
        int row = 0, col = matrix[0].length - 1;
        while (row < matrix.length && col >= 0) {  // start from top right corner
            if (matrix[row][col] == target) {
                return true;
            } else if ( matrix[row][col] < target) { // move down
                row++;
            } else {
                col--;  // move left
            }
        }
        
        return false;
    }
        
    public boolean searchMatrix_failed(int[][] matrix, int target) {
      
        int rstart = 0, rend = matrix.length - 1;
        int cstart = 0, cend = matrix[0].length - 1;
        
        while ( cstart < cend) {
            int cmid = cstart + (cend - cstart) / 2;
            int rmid = rstart + (rend - rstart) / 2;
            if (matrix[rmid][cmid] == target) {
                return true;
            } else if (matrix[rmid][cmid] > target) {
                rend = rmid - 1;
                cend = cmid - 1;
            } else {
                rstart =rmid + 1;
                cstart = cstart + 1;
            }
        }
        return false;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,353评论 0 33
  • Write an efficient algorithm that searches for a value in...
    matrxyz阅读 1,098评论 0 0
  • 问题描述 Write an efficient algorithm that searches for a val...
    codingXue阅读 1,092评论 0 0
  • 开始不再苛责自己,在每一个困了的时刻果断的躺下睡觉,不定表,自然而然的醒来,就有了每一个躺下的轻松幸福和一个个精彩...
    木木的心心阅读 1,521评论 0 0
  • 过年回农村,归来泪满巾。 田荒走野兔,不见种田人。 青壮搓麻将,翁妪带幼孙。 儿童留守多,未见爹娘亲。 偶见两书生...
    浪花朵朵ncj阅读 1,352评论 0 1