二维数组中的查找

题目描述

时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
根据题意,做简易的示意图:
 
编程语言:C++
思路一:暴力破解,结果不通过,于是另谋它路
思路二:每一行都是有序的,可对每一行进行查找,采用二分查找算法,时间复杂度nlog2(n)
class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        bool flag = false;
        int row = array.size();
        int col = array.size();
        for(int i = 0;i < row -1;i++)
        {
            int left = 0,right = col-1;
            while(left <= right)
            {
                int mid = (left + right) / 2;
                if(array[i][mid] == target)
                    flag = true;
                else if(array[i][mid] > target)
                    left = mid+1;
                else
                    right = mid - 1;
            }
        }
        return flag;
    }
};
但最后报出复杂度过高问题
思路三:(来自网上大牛提供)根据提供的二维数组,从上往下,从左往右都是递增有序的规律,那么从左下或右上开始,将元素array[row][col] 与 target进行比较,(假如从左下开始)array[row][col]  < target,那必在元素的右边,col++,如果array[row][col]  > target,那必在元素的上面,row--
class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
       int num_row = array.size();
       int num_col = array[0].size();
       int i,j;
        for(i = num_row-1,j= 0;i >= 0&&j < num_col; )
        {
            if(array[i][j] == target)
            {
                return true;
            }
            else if(array[i][j] > target)
            {
                i--;
                continue;
            }
            else
            {
                j++;
                continue;
            }
            
        }
       return false;
    }
};

这终于成功通过

posted @ 2020-02-27 22:17  牛犁heart  阅读(...)  评论(...编辑  收藏