zoukankan      html  css  js  c++  java
  • 每日一练leetcode

    编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

    每行的元素从左到右升序排列。
    每列的元素从上到下升序排列。

    来源:力扣(LeetCode)

    240. 搜索二维矩阵 II

    此题有三种方法解题:

    1.暴力解法O(n^2)

    2.因为是有序的,所以可以用二分搜索

    3.空间缩减法(此方法在我之前的发布的博客中用了很多次)

    4.利用矩阵的性质*(时间复杂度:O(n+m))此方法我们来实现一下

    首先,我们初始化一个指向矩阵左下角的 (row,col)指针。然后,直到找到目标并返回 true(或者指针指向矩阵维度之外的 (row,col) 为止,我们执行以下操作:如果当前指向的值大于目标值,则可以 “向上” 移动一行。 否则,如果当前指向的值小于目标值,则可以移动一列。不难理解为什么这样做永远不会删减正确的答案;因为行是从左到右排序的,所以我们知道当前值右侧的每个值都较大。 因此,如果当前值已经大于目标值,我们知道它右边的每个值会比较大。也可以对列进行非常类似的论证,因此这种搜索方式将始终在矩阵中找到目标(如果存在)。

    问题来了 为什么要先选定左下角的而不选左上角 右下角呢?

    因为,我们要进行搜索就要有减有增:

    • 选左上角,往右走和往下走都增大,不能选

    • 选右下角,往上走和往左走都减小,不能选
    • 选左下角,往右走增大,往上走减小,可选
    • 选右上角,往下走增大,往左走减小,可选

    所以四种角度两种可选  我们选的左下角 来实现

    class Solution {
        public boolean searchMatrix(int[][] matrix, int target) {
            if(matrix == null||matrix.length == 0){
                return false;
            }
            int m = matrix.length - 1, n = 0;
            while(m >= 0 && n < matrix[0].length){
                if(matrix[m][n] == target){
                    return true;
                }else if(matrix[m][n] < target){
                    n++;
                }else{
                    m--;
                }
            }
            return false;
        }
    }
    执行用时: 6 ms
    内存消耗: 44 MB
  • 相关阅读:
    java编程思想 第三章
    linux安装beego框架环境
    Windows安装beego框架环境
    js 版本号比较实现
    vue element el-table 数据渲染报错 Invalid prop: type check failed for prop "data". Expected Array, got Object
    error c:/wamp64 or php in path
    第三章 函数
    第二章 有意义的命名
    curl实现多路并发请求(请求数量大时再次分割实现循环处理)
    js中常用方法集合
  • 原文地址:https://www.cnblogs.com/nenu/p/15042903.html
Copyright © 2011-2022 走看看