【剑指Offer第一题】二维数组的查找
admin
2023-02-14 19:40:03
0次

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

注:设二维数组为m行n列。语言:C++


解法1:顺序查找

    bool Find(int target, vector > array) {
        vector >::iterator i;
        vector::iterator j;
        vector k;
        for(i = array.begin(); i != array.end(); ++i)
        {
            k = *i;
            for(j = k.begin(); j != k.end(); ++j)
            {
                if(*j == target)
                    return true;
            }
        }
        return false;
    }

时间复杂度O(mn),空间复杂度O(1)。


解法2:折半查找

        bool Find(int target, vector > array) {
        if(array.empty())
            return false;
        int row = array.size();
        int col = array[0].size();
        for(int i = 0; i < row; ++i)
        {
            if(array[i].empty())
                return false;
            int low = 0;
            int high = col-1;
            if(target == array[i][low])
                return true;
            if(target == array[i][high])
                return true;
            while(low <= high)
            {
                int mid = low + (high - low) / 2;
                if(target == array[i][mid])
                   return true;
                else if(target < array[i][mid])
                   high = mid - 1;
                else
                   low = mid + 1;
            }
        }
        return false;
    }

时间复杂度O(mlogn),空间复杂度O(1)。


解法三:根据数组有序特性,从其右上角元素开始比较。

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

时间复杂度O(m+n),空间复杂度O(1)

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...