【力扣】74. 搜索二维矩阵 <二分法>

【力扣】74. 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵:

  • 每行中的整数从左到右按非递减顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

示例 1:

1 3 5 7
10 11 16 20
23 30 34 60

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

示例 2:

1 3 5 7
10 11 16 20
23 30 34 60

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
- 1 0 4 10^4 104 <= matrix[i][j], target <= 1 0 4 10^4 104

题解

二分法改进,将二维数组映射为一维数组进行二分法

public class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        if (matrix == null || matrix.length == 0) {
            return false;
        }
        int row = matrix.length;
        int col = matrix[0].length;

        int left = 0;
        int right = row * col - 1;

        while (left <= right) {
            int mid = left + (right - left) / 2;

            // (x,y) --> x*col+y
            //反过来:一维转二维:matrix[mid/col][mid%col]
            int element = matrix[mid / col][mid % col];
            if (element == target) {
                return true;
            }
            else if (element > target) {
                right = mid - 1;
            }
            else {
                left = mid + 1;
            }
        }
        return false;
    }
}

你可能感兴趣的:(Java相关,#,力扣及OJ,leetcode,矩阵,算法)