挑战30天每天一道leetcode题:Day5 #74搜索二维矩阵

题目:#74搜索二维矩阵

给你一个满足下述两条属性的 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

链接:. - 力扣(LeetCode)

分析

解题思路

如果题目是在一个有序数组中查找一个数或者他的索引就可以用二分查找法。

参考资料:

既然这是一个查找元素的问题,并且数组已经排好序,我们自然可以想到用二分查找是一个高效的查找方式。

输入的 m x n 矩阵可以视为长度为 m x n的有序数组:

行列坐标为(row, col)的元素,展开之后索引下标为idx = row * n + col;反过来,对于一维下标为idx的元素,对应二维数组中的坐标就应该是:

row = idx / n; col = idx % n;

参考代码

package com.atguigu.algorithm.binary_search;

public class SearchMatrix {
    public boolean searchMatrix(int[][] matrix, int target) {
        //先定义m和n
        int m = matrix.length;
        if (m == 0) {
            return false;
        }
        int n = matrix[0].length;

        //二分查找,定义左右指针
        int left = 0;
        int right = m * n - 1;

        while (left <= right) {
            //计算中间位置
            int mid = (left + right) / 2;
            //计算二位矩阵中对应的行列号,取出对应元素
            int midElement = matrix[mid / n][mid % n];
            //判断中间元素与target的大小关系
            if (midElement < target) {
                left = mid + 1;
            } else if (midElement > target) {
                right = mid - 1;
            }else {
                return true;
            }

        }

        return false;
    }

    public static void main(String[] args) {
        int[][] matrix = {{1, 3, 5, 7}, {10, 11, 16, 20}, {23, 30, 34, 60}};
        int target = 20;

        SearchMatrix searchMatrix = new SearchMatrix();
        System.out.println(searchMatrix.searchMatrix(matrix, target));

    }
}

其他

注意点:

 midElement值是多少,在哪

复杂度分析

  1. 时间复杂度 : 由于是标准的二分查找,时间复杂度为O(log(m n))
  2. 空间复杂度没有用到额外的空间,复杂度为O(1)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值