zoukankan      html  css  js  c++  java
  • 力扣练习007---搜索二维矩阵2(240)

    题目描述:

    https://leetcode-cn.com/problems/search-a-2d-matrix-ii/submissions/

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

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

    现有矩阵 matrix 如下:

    [
    [1, 4, 7, 11, 15],
    [2, 5, 8, 12, 19],
    [3, 6, 9, 16, 22],
    [10, 13, 14, 17, 24],
    [18, 21, 23, 26, 30]
    ]
    给定 target = 5,返回 true。

    给定 target = 20,返回 false。

    题目分析:

    1、第一次看题,觉得这道题直接两层for循环就搞定了,为啥还是中等难度呢?按照暴力解法,提交后确实能通过,但是用时很长;

    2、暴力解法耗时长的原因是:程序占用了所有的搜索空间;

    3、恰好最近在看分治思想,分治思想大概描述是:将复杂问题划分成多个简单子问题,然后将子问题的解合并成最终的解;

    4、题目中行和列都是升序的,因此脑袋里蹦出了二分查找法,二分查找法就是运用了分治思想;

    5、二分查找法:对于一个升序的线性结构,查找目标值时,可以先将目标值和线性结构中间值做比较,等于中间值,代表找到目标值;如果大于中间值,那么目标值可能在线性结构后半段;

         小于中间值, 那么目标值可能在线性结构前半段;重复执行前面的步骤,最终会得到最终的结果,而且搜索空间的占用率为50%左右;

    Java代码&力扣运行结果---暴力法:

        public boolean searchMatrix1(int[][] matrix, int target) {
            if (matrix.length == 0) {
                return false;
            }
            int colSize = matrix[0].length;
            for (int[] ints : matrix) {
                for (int j = 0; j < colSize; j++) {
                    if (ints[j] == target) {
                        return true;
                    }
                }
            }
            return false;
        }

    Java代码&力扣运行结果---二分法:

        public boolean searchMatrix2(int[][] matrix, int target) {
            if (matrix.length == 0) {
                return false;
            }
            for (int[] ints: matrix) {
                boolean result = binarySearch(0, ints.length - 1, ints, target);
                if (result) {
                    return true;
                }
            }
            return false;
        }
    
        private boolean binarySearch(int start, int end, int[] nums, int target) {
            if (start <= end) {
                int middle = (start + end) >> 1;
                if (nums[middle] == target) {
                    return true;
                } else if (nums[middle] > target) {
                    return binarySearch(start, middle - 1, nums, target);
                } else {
                    return binarySearch(middle + 1, end, nums, target);
                }
            }
            return false;
        }

  • 相关阅读:
    用Photoshop制作一寸照片
    每天只问孩子这4句话,胜过百般疼爱
    机场也有打折季,你知道吗?请收好这份扫货指南
    这8个习惯会让孩子越来越笨,甚至抑郁!父母赶紧收手
    读后感该怎么写
    vue-cli 4058错误
    bootstrap img自适应
    移动端高清、多屏适配方案
    去掉页面滚动条
    js 404页面跳转
  • 原文地址:https://www.cnblogs.com/sniffs/p/12510288.html
Copyright © 2011-2022 走看看