首页 > 其他分享 >力扣最热一百题——搜索二维矩阵

力扣最热一百题——搜索二维矩阵

时间:2024-09-21 14:55:00浏览次数:11  
标签:false matrix int 矩阵 力扣 二维 目标值 target

目录

题目链接:240. 搜索二维矩阵 II - 力扣(LeetCode)

题目描述

解法一:暴力不解释

Java写法:

运行时间

C++写法:

运行时间

时间复杂度以及空间复杂度

 

解法二:利用自带的大小关系进行Z型走位

Java写法:

运行时间

C++写法

运行时间

时间复杂度以及空间复杂度

总结


题目链接:240. 搜索二维矩阵 II - 力扣(LeetCode)

注:下述题目描述和示例均来自力扣

题目描述

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

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

示例 1:

输入: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

示例 2:

输入: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 = 20
输出:false

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= n, m <= 300
  • -10^9 <= matrix[i][j] <= 10^9
  • 每行的所有元素从左到右升序排列
  • 每列的所有元素从上到下升序排列
  • -10^9 <= target <= 10^9


解法一:暴力不解释

  1. 初始化矩阵维度
    • 首先,通过matrix.length获取矩阵的行数(即y轴的长度,记作lenY)。
    • 然后,通过matrix[0].length获取矩阵的列数(即x轴的长度,记作lenX)。这里假设矩阵至少有一行,因此matrix[0]是有效的。
  2. 遍历矩阵
    • 使用两层嵌套的for循环遍历矩阵的每一个元素。外层循环遍历行(y轴),内层循环遍历列(x轴)。
    • 在遍历过程中,通过matrix[y][x]访问当前遍历到的元素,并将其与目标值target进行比较。
  3. 查找目标值
    • 如果在某个位置(y, x)上,当前元素matrix[y][x]等于目标值target,则表明找到了目标值,函数立即返回true
  4. 未找到目标值
    • 如果遍历完整个矩阵后都没有找到目标值,则函数返回false,表示目标值不在矩阵中。

Java写法:

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {

        // 获取y轴的长度
        int lenY = matrix.length;
        // 获取x轴的长度
        int lenX = matrix[0].length;

        // 判断数组非空
        if(lenY == 0 || lenX == 0){
            return false;
        }

        // 遍历这个二维数组
        for(int y = 0; y < lenY; y++){
            for(int x = 0; x < lenX; x++ ){
                // 如果找到了就返回true
                if(target == matrix[y][x]){
                    return true;
                }
            }
        }
        // 上面都没找到就返回false
        return false;

    }
}
运行时间

C++写法:

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        // 检查矩阵是否为空  
        if (matrix.empty() || matrix[0].empty()) {  
            return false;  
        }  
  
        // 获取y轴的长度(行数)  
        int lenY = matrix.size();  
        // 获取x轴的长度(列数),这里假设矩阵至少有一行  
        int lenX = matrix[0].size();  
  
        // 遍历这个二维数组  
        for (int y = 0; y < lenY; y++) {  
            for (int x = 0; x < lenX; x++) {  
                // 如果找到了就返回true  
                if (target == matrix[y][x]) {  
                    return true;  
                }  
            }  
        }  
  
        // 上面都没找到就返回false  
        return false;  
    }  
};
运行时间

时间复杂度以及空间复杂度

 


解法二:利用自带的大小关系进行Z型走位

  1. 初始位置选择:由于矩阵的行和列都是有序的,从矩阵的右上角或左下角开始搜索都是可以的。这里选择从右上角开始(x = lenX - 1, y = 0),因为这样可以同时利用行和列的排序特性。

  2. 搜索逻辑

    • 如果当前元素matrix[y][x]等于目标值target,则直接返回true,因为找到了目标。
    • 如果当前元素小于目标值target,则由于当前行是从左到右递增的,我们可以确定目标值不可能在当前行的左侧(即更小的数),因此将y(行索引)增加,向下移动到下一行继续搜索。
    • 如果当前元素大于目标值target,则由于当前列是从上到下递增的,我们可以确定目标值不可能在当前列的下方(即更大的数),因此将x(列索引)减少,向左移动到前一列继续搜索。
  3. 循环终止条件:当x小于0或y大于等于lenY时,循环终止。这是因为x代表列索引,其有效范围是[0, lenX-1];而y代表行索引,其有效范围是[0, lenY-1]。如果x变为负数或y超出范围,说明已经搜索了矩阵的所有可能位置,但都没有找到目标值。

  4. 返回结果:如果在循环过程中找到了目标值,则返回true;如果循环结束后仍未找到目标值,则返回false

        这种搜索策略非常的有效,因为它利用了矩阵的行和列排序特性,通过每次比较后只排除一行或一列的可能性,从而减少了搜索空间。

Java写法:

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        // 由于数组是有序的,我们可以利用这个特性

        // 获取x,y轴方向上的长度
        int lenX = matrix[0].length;
        int lenY = matrix.length;

        // 从右上角开始寻找
        int x = lenX - 1;
        int y = 0;

        // 寻找逻辑
        while(x >= 0 && y < lenY){
            // 发现目标返回true
            if(matrix[y][x] == target){
                return true;
            }
            // 由于我们是从右上角开始寻找的
            // 它的左边的数比他小,他下边的数比他大
            // 所以这里如果比target小,就往下找大的数
            if(matrix[y][x] < target){
                y++;
            }else{
                // 相反,这里比target大,就往左找小的数
                x--;
            }
        }
        // 如果最后还是没找到就返回false
        return false;

    }
}

运行时间

C++写法

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {

  
        // 获取x,y轴方向上的长度  
        int lenX = matrix[0].size();  
        int lenY = matrix.size();  
  
        // 从右上角开始寻找  
        int x = lenX - 1;  
        int y = 0;  
  
        // 寻找逻辑  
        while (x >= 0 && y < lenY) {  
            // 发现目标返回true  
            if (matrix[y][x] == target) {  
                return true;  
            }  
            // 由于我们是从右上角开始寻找的  
            // 它的左边的数比他小,他下边的数比他大  
            // 所以这里如果比target小,就往下找大的数  
            if (matrix[y][x] < target) {  
                y++;  
            } else {  
                // 相反,这里比target大,就往左找小的数  
                x--;  
            }  
        }  
        // 如果最后还是没找到就返回false  
        return false;  
    }  
};

运行时间

时间复杂度以及空间复杂度


总结

        总结来说就是暴力梭哈一切,冷静思考获得新生

标签:false,matrix,int,矩阵,力扣,二维,目标值,target
From: https://blog.csdn.net/DDDDWJDDDD/article/details/142416063

相关文章

  • 获取支付链接转化为二维码
    链接转为二维码,需要安装vue-qrcodenpminstallvue-qrcode装二维码的容器:<divclass="amount"v-show="amount"><divclass="amount_text">金额:{{selected.price}}元</div><divclass="amount_img&......
  • Leetcode 378. 有序矩阵中第 K 小的元素
    1.题目基本信息1.1.题目描述给你一个nxn矩阵matrix,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。请注意,它是排序后的第k小元素,而不是第k个不同的元素。你必须找到一个内存复杂度优于O(n^2)的解决方案。1.2.题目地址https://leetcode.cn/problem......
  • 【力扣20】有效的括号
    20.有效的括号-力扣(LeetCode)括号序列压入栈中,遇到匹配的出栈,最后判断栈是否为空直接使用栈的数据结构stack。classSolution{public:boolisValid(strings){stack<char>stk;//初始化栈for(autoc:s){//入栈if(c=='......
  • 力扣题解2376
    大家好,欢迎来到无限大的频道。今日继续给大家带来力扣题解。题目描述(困难):统计特殊整数如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。给你一个 正 整数 n ,请你返回区间 [1,n] 之间特殊整数的数目。​解题思路:要计算区间([1,n])之间的......
  • 代码随想录算法训练营第一天 | 209. 长度最小的子数组 59. 螺旋矩阵 58. 区间和 Java
    209.长度最小的子数组题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/description/解题思路思路1:暴力解法通过两个for循环,找出所有的可能的区间,并比较出最小区间思路2:滑动窗口因为需要找出的是连续的一个子数组,所以可以模拟一个从左到右滑动的一个......
  • 力扣188-买卖股票的最佳时机 IV(Java详细题解)
    题目链接:188.买卖股票的最佳时机IV-力扣(LeetCode)前情提要:本题是由123.买卖股票的最佳时机III-力扣(LeetCode)变形而来,123是只能买卖俩次股票,该题是只能买卖k次股票,我相信当你做完这道题或者看完我上道题的题解,那么写这道题会轻松一点。因为本人最近都来刷dp类的题......
  • [Java原创精品]基于Springboot+Vue的座位预约系统、自习室预约管理、微信二维码扫描模
    项目提供:完整源码+数据库sql文件+数据库表Excel文件1、项目功能描述本项目为双角色,用户和管理员,用户使用前台,管理员使用后台。1.1注册注册功能:填写用户名、密码进行注册。(“我已阅读同意《隐私政策》和《服务条款》”没有做后续,只是单纯有这样一行文字做模拟)1.2......
  • 1,Python数分之Pandas训练,力扣,1783. 大满贯数量
    学习:知识的初次邂逅复习:知识的温故知新练习:知识的实践应用目录 一,原题力扣链接二,题干三,建表语句四,分析四,Pandas解答:五,验证六,总结 一,原题力扣链接.-力扣(LeetCode)二,题干表:Players+----------------+---------+|ColumnName|Type|+--------......
  • 【力扣刷题】2090.半径为k的子数组平均值(定长滑动窗口)
    题目:给你一个下标从 0 开始的数组 nums ,数组中有 n 个整数,另给你一个整数 k 。半径为k的子数组平均值 是指:nums 中一个以下标 i 为 中心 且 半径 为 k 的子数组中所有元素的平均值,即下标在 i-k 和 i+k 范围(含 i-k 和 i+k)内所有元素的平均......
  • 【力扣刷题】1232.缀点成线
    题目:给定一个数组 coordinates ,其中 coordinates[i]=[x,y] , [x,y] 表示横坐标为 x、纵坐标为 y 的点。请你来判断,这些点是否在该坐标系中属于同一条直线上。示例1:输入:coordinates=[[1,2],[2,3],[3,4],[4,5],[5,6],[6,7]]输出:true示例2: 输入:coordina......