二维数组中的查找

来源:互联网 发布:飞鹰网络电视手机版 编辑:程序博客网 时间:2024/05/22 10:54

题目

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
题目解释

当我们需要解决一个复杂的问题时,一个很有效的办法就是从一个具体的问题入手,通过分析简单具体的例子,试图寻找普遍规律。针对这个问题,我们不妨也从题目给出的例子入手。
首先我们选取右上角的数字9。由于9大于7,并且9还是第四列中最小的数字,因此7不可能出现在第四列。于是,我们把这一列从需要考虑的区域内剔除。在剩下的矩阵中,位于右上角的数字是8。同样8大于7,因此8所在的列我们也可以剔除。
在剩余的两列中, 2位于右上角,2小于7,那么要查找的7只可能在2的下边。于是我们把2所在的行也剔除。在剩下的矩阵中,4位于右上角,和前面一样,我们把数字4所在的行也剔除。
在剩下的2*2矩阵中,位于右上角的恰好就是我们要查找的数字7,于是查找过程就可以结束了。

这里写图片描述

总结上述查找过程,可以发现:首先选取数组右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除该数字所在的列;如果该数字小于要查找的数字,则剔除该数字所在的行。直到找到要查找的数字,或者要查找的范围为空。

bool Find(vector<vector<int> > array, int target) {    bool found = false;    if (!array.empty())    {        int rows = array.size();        int cols = array[0].size();        if (rows > 0 && cols > 0)        {            int row = 0;            int col = cols - 1;            while (row < rows && col >= 0)            {                if (array[row][col] == target)                {                    found = true;                    break;                }                else if (array[row][col] > target)                    --col;                else                    ++row;            }        }    }    return found;}
0 0