牛客题解 | 矩阵查数_1

题目

题目链接

题解

题目难度:简单
知识点:数学逻辑、数组

方法一:

思路:
1:将数据输入动态数组matrix中,从左下脚开始遍历,初始行数i=m-1,初始列数j=0。

2:判断现在所在行数i,j=0,即matrix[i][0]与K值进行比较,如果matrix[i][0]>k,由于每行元素值依次增大,所以一定不在该行,i--之后重复第2步。

3.如果matrix[i][0]<k,遍历该行的所有列j,如果存在matrix[i][j]=k,打印true,使用return语句结束程序;当出现matrix[i][j]>k时,表明该行j+1到n列都不会出现matrix[i][j]=k的情况,因此将i--,重复第2步。如果当j=n时未出现上两种情况,需要继续判断上一行,也跳转到第2步。

4.遍历完所有的i时,没有遇到return结束程序语句,即没有出现matrix[i][j]=k,打印false。

时间复杂度O(m+n),空间复杂度O(m*n)

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int m, n, k;
    cin &gt;&gt; m &gt;&gt; n;
    vector&lt; vector<int> &gt; matrix;
  for(int i = 0; i &lt; m; i++) {
        vector<int> temp;
        for(int j = 0; j &lt; n; j++) {
            cin &gt;&gt; k;
            temp.push_back(k);
        }
        matrix.push_back(temp);
    }
    cin &gt;&gt; k;
    for(int i=m-1;i&gt;=0;i--){
    if(matrix[i][0]&gt;k) continue;
    else{
      for(int j=0;j<n;j++){ if(matrix[i][j] cout<<"true"<<endl; return 0; }>k){
                    break;
        }
      }
    }
  }
  cout&lt;&lt;"false"&lt;<endl; return 0; } ``` ##方法二:以空间换时间 从题干可知:矩阵中出现的数字与需要查找的数(k)都为0~100000之间的整数。因此我们用一个布尔型数组m,将其大小设置为1000001,矩阵中出现的每一个数字num,将m[num]值设置为true。最后判断需要查找的数k,即m[k]是否为true。如果为true输出true,否者输出false。 ####时间复杂度o(1),空间复杂度o(n) #include <iostream>
using namespace std;
int main(){
    int m,n,num;
    bool M[100001];
    cin&gt;&gt;m&gt;&gt;n;
    for(int i=0;i<n;i++) for(int j="0;j<m;j++){" cin>&gt;num;
            M[num] = true;
        }
    int k;
    cin&gt;&gt;k;
    if(!M[k])
        cout&lt;&lt;"false"&lt;</n;i++)></endl;></n;j++){></int></int></vector></iostream></k,遍历该行的所有列j,如果存在matrix[i][j]=k,打印true,使用return语句结束程序;当出现matrix[i][j]>
posted @ 2025-03-10 10:53  wangxiaoxiao  阅读(9)  评论(0)    收藏  举报