【经典】剑指offer 二维数组中的查找 O(nlogn)和O(m+n)的方法

 数组 二维数组中的查找 117518 23.46%

时间限制:1秒 空间限制:32768K 热度指数:933761

本题知识点: 查找

 算法知识视频讲解

题目描述

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

方法1  O(nlogn)

枚举+二分。最容易想到的也是最简单的。再加一点小优化。

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        int len;
        for(int i=0;i<array.size();i++)
        {
            len=array[i].size();
            if(len>0 && array[i][0]<=target && array[i][len-1]>=target)
                if(*lower_bound(array[i].begin(),array[i].end(),target)==target)
                {
                    return 1;
                }
        }
        return 0;
    }
};

方法二 O(n+m)

因为都是排序的,所以先用target与最后一列第一个进行比较,此时分为两种情况,若大于,则第一排不用找,若小于,则,最后一列不用找。 (理论上应该是最快的方法了吧)

顺便吐槽一下剑指offer的数据:数据量过小怎么样都能过,而且体现不出复杂度的区别,甚至高复杂度代码(代码简单)比低复杂度的代码(代码复杂)结果出的都快。很操蛋。

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        int len=array.size();
        int x,y,t;
        y=0;
        x=array.size()-1;
        while(1)
        {
            if(x<0 || y==array[0].size())
            {
                return 0;
            }
            t=array[y][x];
            if(t==target)
                return 1;
            if(target<t)
            {
                x--;
            }
            else 
                y++;
        }
        return 0;
    }
};

猜你喜欢

转载自blog.csdn.net/GreyBtfly/article/details/87942854
今日推荐