美文网首页lintcode刷题记录[java]
简单题28-搜索二维矩阵

简单题28-搜索二维矩阵

作者: Airycode | 来源:发表于2018-05-09 11:16 被阅读3次

描述

写出一个高效的算法来搜索 m × n矩阵中的值。

这个矩阵具有以下特性:

每行中的整数从左到右是排序的。
每行的第一个数大于上一行的最后一个整数。
您在真实的面试中是否遇到过这个题? 是
样例

考虑下列矩阵:

[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
给出 target = 3,返回 true
挑战

O(log(n) + log(m)) 时间复杂度
【思路】
首选从数组中的第一行的最后一列中的数字开始,如果大于这个数字就row++,如果小于就col--,如果相等就直接返回true,并且跳出循环
【代码实现】

package 搜索矩陣;

public class Main {

    public static void main(String[] args) {
        int[][] arr = { 
                {1,2,8,10,16,21,23,30,31,37,39,43,44,46,53,59,66,68,71},
                {90,113,125,138,157,182,207,229,242,267,289,308,331,346,370,392,415,429,440},
                {460,478,494,506,527,549,561,586,609,629,649,665,683,704,729,747,763,786,796},
                {808,830,844,864,889,906,928,947,962,976,998,1016,1037,1058,1080,1093,1111,1136,1157},
                {1180,1204,1220,1235,1251,1272,1286,1298,1320,1338,1362,1378,1402,1416,1441,1456,1475,1488,1513},
                {1533,1548,1563,1586,1609,1634,1656,1667,1681,1706,1731,1746,1760,1778,1794,1815,1830,1846,1861}
                };
        int target = 1861;
        System.out.println(searchMatrix(arr, target));
    }

    public static boolean searchMatrix(int[][] matrix, int target) {
        boolean result = false;

        if (matrix==null||matrix.length==0||(matrix.length==1&&matrix[0].length==0)) {
            result = false;
        } else {
            int row = 0;
            int col = matrix[0].length - 1;
            while (row <= matrix.length - 1 && col>=0) {
                if (matrix[row][col] < target) {
                    row++;
                } else if (matrix[row][col] > target) {
                    col--;
                } else {
                    result = true;
                    break;
                }

            }
        }

        return result;
    }

}

相关文章

网友评论

    本文标题:简单题28-搜索二维矩阵

    本文链接:https://www.haomeiwen.com/subject/lzdnrftx.html