zoukankan      html  css  js  c++  java
  • 搜索二维矩阵 II[Leetcode]

    这道题是让我们在二维数组中快速搜索一个数字,这个二维数组各行各列都是按递增顺序排列的,观察题目中给的例子,我们可以发现有两个位置的数字很有特点,左下角和右上角的数,左下角的18,往上所有数变小,往右所有数变大。那么我们就可以和目标数相比较,如果目标数打,就往右搜,如果目标数小,就往上搜。这样就可以判断目标数是否存在。当然我们也可以把起始数放在右上角,往左和往下搜,停止条件设置正确就行。

    算法描述:

    • 左下角的元素是这一行中最小的元素,同时又是这一列中最大的元素。比较左下角元素和目标:
      • 若左下角元素等于目标,则找到
      • 若左下角元素大于目标,则目标不可能存在于当前矩阵的最后一行,问题规模可以减小为在去掉最后一行的子矩阵中寻找目标
      • 若左下角元素小于目标,则目标不可能存在于当前矩阵的第一列,问题规模可以减小为在去掉第一列的子矩阵中寻找目标
    • 若最后矩阵减小为空,则说明不存在

    代码如下:

    class Solution {
        public boolean searchMatrix(int[][] matrix, int target) {
            if (matrix == null || matrix.length == 0 || matrix[0] == null || matrix[0].length == 0) return false;
            int x = matrix.length-1,y = 0;while(x >= 0&& y < matrix[0].length){
                if(matrix[x][y] > target) --x;
                else if(matrix[x][y] < target) ++y;
                else return true; //当前数就是要找的数
            }
            return false;
        }
    }

    还有一种解法就是对每一行进行二分查找,即遍历矩阵中的每一行,进行二分查找,时间复杂度为O(mlogn)。上面用分治算法的时间复杂度为O(m+n)。

  • 相关阅读:
    待整理[图片验证码的破解]
    关于反爬的思索[集合]
    关于showdoc的服务器部署[转]
    jQuery插件实现多图片和单图片上传
    FTP 图片上传
    多线程(临界点处理)
    Python可迭代对象、迭代器和生成器
    一文搞懂Python函数(匿名函数、嵌套函数、闭包、装饰器)!
    Python比较操作符、变量赋值、对象拷贝
    Python并发编程——多线程与协程
  • 原文地址:https://www.cnblogs.com/zhlz/p/10488823.html
Copyright © 2011-2022 走看看