1、【二维有序数组查找】

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

方案肯定是要用O(n)级别的,如果是O(N^2),那么还就是暴力破解。这样根本就没有利用到题目的性质====》二维有序数组,所以还是老老实实想O(N)的算法吧!

即存在数组满足以下规律:

	 ------>
	|
	|
	|
	↓
问怎么如何快速找到其中的一个元素?

存在问题:问题来了,如果从(0,0)出发,那么问题肯定是极度恶心的,因为根本不知道下一次是往下走还是往右边走。。。因为【两个方向都是增加的】

发现问题:这时候我们得知了问题点在于【从(0,0)出发,会使得无论往右还是往下都是增加。】那么是否存在某个点使得【一个方向增加一个方向减少】?
解决问题:使用(0,n-1)点或者(n-1,0)点,会发现一个方向是增加,一个方向是减少。如果值小了,那么就往增加方向查找,如果值大了,就往减少方向减少。这时候代码就十分的轻而易举写出来了。

代码:

    bool Find(int target, vector<vector<int> > array) {
        int row = array.size();
        int col = array[0].size();
        for (int i = 0,j = col - 1; i < row && j >= 0;)
        {
            if (array[i][j] == target)
            {
                return true;
            }
            if (array[i][j] < target)
            {
                ++i;
            }
            else 
            {
                --j;
            }
        }
        return false;
    }

猜你喜欢

转载自www.cnblogs.com/ccXgc/p/9001496.html