LeetCode-74. 搜索二维矩阵-Java-medium

题目链接

法一
    /**
     * 法一
     * 时间复杂度:O(m + n)
     *
     * @param matrix
     * @param target
     * @return
     */
    public boolean searchMatrix(int[][] matrix, int target) {
        if (matrix.length == 0) {
            return false;
        }
        int row = 0, col = matrix[0].length - 1;
        while (row < matrix.length && col >= 0) { // 选择右上角作为切入点
            if (matrix[row][col] < target) {
                row++;
            } else if (matrix[row][col] > target) {
                col--;
            } else {
                return true;
            }
        }
        return false;
    }
法二(二分)
    /**
     * 法二(二分)
     * 时间复杂度:O(log(m * n))
     * (1)直接二分,把二维当成一维来做,时间复杂度为O(log(m * n))
     * (2)两次二分,第一次二分查找行,确定行后在此行二分查找列,时间复杂度为O(logm + logn)
     * (3)O(m + n) > O(log(m * n)) = O(logm + logn)
     *
     * @param matrix
     * @param target
     * @return
     */
    public boolean searchMatrix_2(int[][] matrix, int target) {
        int rowSize = matrix.length, colSize = matrix[0].length;
        int left = 0, right = rowSize * colSize - 1;
        int row, col;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            row = mid / colSize;
            col = mid % colSize;
            if (matrix[row][col] == target) {
                return true;
            } else if (matrix[row][col] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return false;
    }
本地测试
        /**
         * 74. 搜索二维矩阵
         */
        lay.showTitle(74);
        Solution74 sol74 = new Solution74();
        int[][] matrix74 = new int[][]{{1, 3, 5, 7}, {10, 11, 16, 20}, {23, 30, 34, 60}};
        arrayOpt.showIntTwoDimArray(matrix74, matrix74.length);
        System.out.println(sol74.searchMatrix(matrix74, 3));
        System.out.println(sol74.searchMatrix_2(matrix74, 3));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值