leetcode题解-74. Search a 2D Matrix && 240. Search a 2D Matrix II

来源:互联网 发布:爱知流量计 手机 编辑:程序博客网 时间:2024/06/08 11:48

74,Search a 2D Matrix 题目:

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 from left to right.The first integer of each row is greater than the last integer of the previous row.For example,Consider the following matrix:[  [1,   3,  5,  7],  [10, 11, 16, 20],  [23, 30, 34, 50]]Given target = 3, return true.

本题相对比较简单,因为矩阵中的元素都是有序的,所以直接做一个元素位置转换(从矩阵到数组)即可。代码入下:

public class searchMatrix {    public boolean searchMatrix(int[][] matrix, int target) {        if(matrix == null || matrix.length == 0 || matrix[0].length == 0)            return false;        int left = 0, right = matrix.length*matrix[0].length-1, num = matrix[0].length, mid;        while(left <= right){            mid = (left + right)/2;            if(matrix[mid/num][mid%num] == target)                return true;            else if(matrix[mid/num][mid%num] > target)                right = mid - 1;            else                left = mid + 1;        }        return false;    }    //还可以先遍历每行第一个元素,找到第一个比target大的,说明再起上一行。然后再遍历改行即可。}

240,Search a 2D Matrix II 题目如下:

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.

相对于上一题,本题矩阵中的元素有序性变弱,但是我们仍然可以找到关键元素所在,那就是右上角的元素,比整行别的元素都大,比整列别的元素都小,所以根据该元素进行判断即可。算法的时间复杂度是O(m+n).代码入下:

public class searchMatrix2 {    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){            if(matrix[row][col] == target)                return true;            else if(matrix[row][col] > target)                col --;            else                row ++;        }        return false;    }}
原创粉丝点击