二维数组中的查找

问题描述:
在一个二维数组中,每一行都是按照从左向右递增的顺序排序,每一列都是按照从上到下递增的顺序排序,请完成一个函数,输入这样的一个二维数组和一个整数,判断该数组中是否有该整数
题目分析:
这里写图片描述
在分析这个问题的时候,很多人都会把二维数组画成矩形,然后从数组中选取一个数字,分3中情况来分析查找过程。(1)当数组中选取的数字刚好和要查找的数字相等时,就结束查找过程。(2)如果选取的数字小于要查找的数字,那么就根据数组排列的规则,要查找的数字应该在当前选取的位置的右边或者下边。(3)如果选取的数字大于要查找的数字,那么要查找的数字应该在当前位置的上边或者左边
这里写图片描述
注:在数组中间选择一个数(深色方格),根据它的大小判断要查找的数字可能出现的区域(阴影部分)
在上面的分析中,由于要查找的数字相当于当前选取的位置有可能在两个区域中出现,而这两个区域还有重叠,这问题看起来就复杂了,于是很多人在这里卡住了。
当我们需要解决一个复杂的问题的时候,一个很有效的方法就是从一个具体的问题入手,通过分析简单具体的例子,试图寻找普遍的规律。针对这一个问题,我们不妨也从一个具体的例子入手。西面我们在题目中给出数组中查找数字7为例来分析查找过程。
这里写图片描述
这里写图片描述
这里写图片描述
总结上述查找过程:
1、首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束。
2、如果该数字大于要查找的数字,剔除这个数字所在的列
3、如果该数字小于要查找的数字,剔除这个数字所在的行
每一次都在数组的范围中剔除一行或者一列,这样可以每一步都缩小查找的范围,直到找到要查找的数字,或者查找范围为空。
程序代码:

#include <iostream>

using namespace std;

bool Find(int(*arr)[4], int row, int column, int num)
{
    int tmprow = 0;
    int tmpcol = column-1;

    while (tmprow<row && tmpcol>=0) 
    {
        if (arr[tmprow][tmpcol] == num)
            return true;
        else if (arr[tmprow][tmpcol] > num)
        {
            //删除一列 
            --tmpcol;
        }
        else if (arr[tmprow][tmpcol] < num)
        {
            //删除一行
            ++tmprow; 
        }
    }
    return false;
}

int main()
{
    int arr[4][4]; 
    //init
    for (int i=0; i<4; ++i)
    {
        for (int j=0; j<4; ++j)
        {
            cin >> arr[i][j]; 
        }
    }

    cout << Find(arr, 4, 4, 5); 

    return 0;
}

在前面的分析中,我们每一次都是选取数组查找范围内的右上角数字
同样,我们也可以选取左下角的数字。
但是不可以选取左上角或者右下角的数字,因为无法缩小查找范围

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值