机考刷题之 7 LeetCode 240 搜索二位矩阵Ⅱ

题目

分析

思路一

并不高效的搜索,先遍历第一列和第一行,由于是升序数组,所以分别找出小于target的首元素对应的行、列,然后再遍历这些行列交叉的节点元素值与target作比较,返回结果。

代码

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m = matrix.size();
        int n = matrix[0].size();
        if(matrix[0][0]>target||matrix[m-1][n-1]<target){//如果数组最小的数都比target大或者最大的数都比target小,那么直接返回假
            return false;
        }
        vector<int>line;
        vector<int>col;
        for(int i = 0;i<n;i++){//寻找首元素小于target,target可能所在的列
            if(matrix[0][i]==target)return true;
            else if(matrix[0][i]<target){
                col.push_back(i);
            }
            else continue;
        }
        for(int i = 0;i<m;i++){//寻找首元素小于target,target可能所在的行
            if(matrix[i][0]==target)return true;
            else if(matrix[i][0]<target){
                line.push_back(i);
            }
            else continue;
        }
        for(auto i:line){//遍历交叉节点
            for(auto j:col){
                if(matrix[i][j]==target)return true;
            }
        }
        return false;
    }
};

结果

并非高效。

思路二

由于每一行和每一列都是升序的,那么我们需要找出一个起始点,让它的大体移动方向是有区分度的,具体来说就是如下:

左上角:往右往下移动,martix值都变大,无法区分,不可用

右上角:往左martix变小,往下martix变大,可区分,可用

左下角:往右martix变大,往上martix变小,可区分,可用

右下角:往左往上移动,martix都变小,不可区分,不可用

那么我们可以选择右上角向左或向下移动,当matrixij大于target,由于此时向左或向上是变小,但我们就是从上面下来的,所以此时向左移动或许能找到target,同理,当matrixij小于target时,该向下。选左下角同理。代码选择从右上角开始。

代码

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m = matrix.size();//行
        int n = matrix[0].size();//列
        if(matrix[0][0]>target||matrix[m-1][n-1]<target){//如果数组最小的数都比target大或者最大的数都比target小,那么直接返回假
            return false;
        }
        int col = n-1,line = 0;//从右上角开始
        while(line<=m-1&&col>=0){
            if(matrix[line][col]>target)col--;
            else if(matrix[line][col]<target)line++;
            else return true;
        }
        return false;
    }
};

结果

相关推荐
KaMeidebaby4 小时前
卡梅德生物技术快报|PD1 单克隆抗体定制配套 N 糖全谱质控开发
前端·人工智能·算法·数据挖掘·数据分析
8Qi84 小时前
LeetCode 235. 二叉搜索树的最近公共祖先(LCA)
算法·leetcode·二叉树·递归·二叉搜索树·lca·迭代
bIo7lyA8v5 小时前
算法稳定性分析中的随机扰动建模的技术8
算法
科研online5 小时前
基于多源数据和XGBoost-SHAP分析中国大陆绿地碳汇空间变异影响因素的非线性相关性与尺度差异
算法·学习方法
Cthy_hy6 小时前
拓扑排序超详解:原理 + Kahn 贪心算法
python·算法·贪心算法
三品吉他手会点灯6 小时前
C语言学习笔记 - 43.运算符与表达式 - 运算符1 - 运算符的分类和简单介绍
c语言·笔记·学习·算法
心之伊始6 小时前
Java 后端接入大模型:从 Token、并发到推理成本的完整估算方法
java·spring boot·性能优化·大模型·llm
VkN2X2X4b6 小时前
算法复杂度的实验验证与误差分析的技术8
算法
其利天下技术6 小时前
风扇灯无刷电机自适应算法实战指南
算法·cocos2d·无刷电机自适应算法·bldc驱动自适应算法·其利无刷电机驱动算法
8Qi86 小时前
LeetCode 494:目标和(Target Sum)—— 题解 ✅
算法·leetcode·职场和发展·动态规划·01背包