二维数组中的查找

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

难点分析:
一遍情况下,我们在二维数组中查找某一个元素,都是将数组遍历一遍。此时时间复杂度为O(M+N)
但是,本题中的二维数组的情况比较特殊。从左到右递增,从上到下递增,而且要求效率尽可能高。提示可以利用此规律,进行较快的查找。

思路:
根据题意,知道,二维矩阵中,某一行最大数在最左边,某一列最大数在最下面。
1,我们可以首先选取矩阵中右上角的数字。
2,如果该数字大于要寻找的数字,剔除这个数字所在的列。
3,如果该数字小于要查找的数字,剔除这个数字所在的行。
这样每一步都来缩小需要查找矩阵空间的范围。知道找到为止。

实现代码:
所需头文件

#include <assert.h>
int* Find(int arr[], int m, int n, int k)
{
    assert(nullptr != arr);
    assert(0 != m);
    assert(0 != n);

    //初始从右上角开始比较(因为循环一次可以最大化的缩小查找范围)
    int i = 0;  //比较数字所在行
    int j = n-1;  //比较数字所在列
    int *result = nullptr;

    while (i <m && j >= 0)
    {
        if (arr[i*n + j] > k)  //往改行左边寻找
            --j;
        else if (arr[i*n + j] < k) //往该列下面寻找
            ++i;
        else //arr[i][j] == k
        {
            result = &arr[i*n + j];
            break;
        }
    }

    return result; //若没有找到,则result依旧为nullptr。
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值