二维数组中的查找

来源:互联网 发布:打不开painter2017软件 编辑:程序博客网 时间:2024/06/03 16:01

问题描述:
在一个二维数组中,每一行都是按照从左向右递增的顺序排序,每一列都是按照从上到下递增的顺序排序,请完成一个函数,输入这样的一个二维数组和一个整数,判断该数组中是否有该整数
题目分析:
这里写图片描述
在分析这个问题的时候,很多人都会把二维数组画成矩形,然后从数组中选取一个数字,分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
原创粉丝点击