二维数组中的查找

题目描述:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
题目来源
http://ac.jobdu.com/problem.php?pid=1384
题目分析:
假设数组有m行、n列,待查找元素为t
由于数组行、列均为递增排序,那么对于一个元素data[i][j]和待查找元素比较有三种情况
(1)data[i][j] = t, 那么得到结果,返回
(2)data[i][j] < t, 那么(i,j)左下方的元素都小于t,可以将这部分排除
(3)data[i][j] > t, 那么(i,j)右上方的元素都大于t,可以将这部分排除
考虑一个比较特殊的右上角位置(1,n),若data[1][n] = t, 那么得到结果,返回,若data[1][n] < t,那么可以排除第1行,若data[1][n] > t,那么可以排除第n列,问题变成在删除第1行或者第n列的子数组中查找t,将当前位置更新到现在数组的右上角,重复之前的操作,直到找到t或者整个数组被删除掉
时间复杂度:O(m + n)
示例代码:
int data[m][n];

bool run(int m, int n, int t) {
    int x = 0, y = n - 1;

    while(x < m && y >= 0) {
        if(data[x][y] == t) {
            return true;
        } else if(data[x][y] < t) {
            ++x;
        } else {
            --y;
        }
    }

    return false;
}
原文地址:https://www.cnblogs.com/daijinqiao/p/3328728.html