题解

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

方法一:

思路:
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 >> m >> n;
    vector< vector<int> > matrix;
    for(int i = 0; i < m; i++) {
        vector<int> temp;
        for(int j = 0; j < n; j++) {
            cin >> k;
            temp.push_back(k);
        }
        matrix.push_back(temp);
    }
    cin >> k;
    for(int i=m-1;i>=0;i--){
        if(matrix[i][0]>k) continue;
        else{
            for(int j=0;j<n;j++){
                if(matrix[i][j]==k){
                    cout<<"true"<<endl;
                    return 0;
                }
                if(matrix[i][j]>k){
                    break;
                }
            }
        }
    }
    cout<<"false"<<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>>m>>n;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++){
            cin>>num;
            M[num] = true;
        }
    int k;
    cin>>k;
    if(!M[k])
        cout<<"false"<<endl;
    else
        cout<<"true"<<endl;
    return 0;
}