《剑指offer》面试题4:二维数组中的查找

题目:在一个二维数组中,每一行都从左向右递增,每一列都从上到下递增。给定一个数target,判断这个数是否出现在二维数组中。

解题思路

如果使用暴力搜索整个数组的话时间复杂度是O(n^2),比较不理想,那么有没有更快地方法呢?观察如下数组

1   2    8    9
2   4    9   12
4   7   10   13
6   8   11   15

我们可以发现,在数组中有两个特殊的点,就是矩阵的右上角和矩阵的左下角。这两个点都有一个特性,如果目标值大于或小于点的值时,就可以排除一整列或者一整行,那么最多只需要执行2n次排除操作,时间复杂度是O(n)。那么我们以右上角为例实现代码:

    bool Find(int target, vector<vector<int> > array) {
        if (array.empty())  return false;

        int i = 0, j = array[0].size()-1;

        while(i<array.size() && j<array[0].size()){
            if (array[i][j]==target)
                return true;
            else if (array[i][j]<target)
                i++;
            else
                j--;
        }
        return false;
    }

猜你喜欢

转载自blog.csdn.net/acelove40/article/details/79790327