一个m*n的矩阵,从左到右从上到下都是递增的,给一个数x,判断x是否在矩阵中。要求效率尽可能的高

9 篇文章 0 订阅

我们可以这样入手,比如给一个3*3的二维数组,从每一行的最大值开始比较:
1.如果X大于a[0][2],第一行中的数据肯定都比x小,所以继续跟下一行的a[1][2]比较
2.如果X小于a[0][2],第3列中的数据肯定都比x大,所以继续跟上一列的
a[0][1]比较
3.循环条件为行数>=0;列数<=n-1;
实现代码如下:

#define M 3
#define N 3
bool Find(int a[M][N],const int x,int n)
{
    int col = n-1;
    int row = 0;
    if (x > a[n-1][n- 1] || x < a[0][0])
        return false;
    while (col<=n-1&&row>=0)
    {
        if (x < a[row][col])
            col--;
        else if (x>a[row][col])
            row++;
        else
            return true;
    }
    return false;
}


int main()
{
    int a[M][N] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    cout << Find(a, 1, 3) << endl;
    cout << Find(a, 9, 3) << endl;
    cout << Find(a, 4, 3) << endl;
    cout << Find(a, 11, 3) << endl;
    system("pause");
    return 0;
}

结果如图:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值