【算法】【线性表】【数组】搜索二维矩阵

1  题目

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

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

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

示例 1:

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

示例 2:

输入: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
  • -104 <= matrix[i][j], target <= 104

2  解答

先定位在第几行, 然后从该行进行二分查找:

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        // 根据特性,先判断target 在哪一行
        int i = 0;
        for (; i < matrix.length; i++) {
            if (matrix[i][0] == target) {
                return true;
            }
            if (matrix[i][0] < target) {
                continue;
            }
            // 因为在上一行 所以 i--
            if (i > 0) {
                i--;
            }
            break;
        }
        // 不是 break出来的,正常遍历出来的 需要-- 表示最后一行进行二分查找
        if (i == matrix.length) {
            i--;
        }
        return twoSearch(matrix[i], 0, matrix[i].length - 1, target);
    }
    // 二分查找判断
    public boolean twoSearch(int[] nums, int start, int end, int target) {
        if (start > end) {
            return false;
        }
        int middle = start + (end - start) / 2;
        if (nums[middle] == target) {
            return true;
        } else if (nums[middle] < target) {
            return twoSearch(nums, middle + 1, end, target);
        } else {
            return twoSearch(nums, start, middle - 1, target);
        }
    }
}

加油。

posted @ 2024-03-13 08:26  酷酷-  阅读(1)  评论(0编辑  收藏  举报