题解 | #二维数组中的查找#

二维数组中的查找

http://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e

题解一:暴力搜索
解题思路: 逐行逐列的搜索二维数组,判断是否存在目标值。

复杂度分析:
时间复杂度:O(MN)
空间复杂度:O(1)

实现如下:

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
       for(auto i : array)//c++11语法
        {
            for(auto j : i)
            {
                if(j == target) return true;//找到目标值
            }
        }
        return false;//未找到
    }
};

题解二: 利用二分搜索
解题思路: 利用数组每行每列都是递增特性。
主要思路: 逐行使用二分搜索,查找是否含有target
如样例:分别每行使用一次二分搜索(M次二分查找)
图片说明

复杂度分析:
时间复杂度:O(Mlog N )
空间复杂度:O(1)

实现如下:

class Solution {
public:
    bool binary_search(vector<int> arr,int target){//二分查找函数
        int left = 0,right = arr.size()-1;
               while(left<=right)
                {
                    int mid = (left+right)/2;
                    if(arr[mid] == target) return true;//找到了
                    else if(arr[mid] < target) left = mid+1;//往右边遍历
                    else right = mid-1;//往左边遍历
                }
                return false;
        }
    bool Find(int target, vector<vector<int> > array) {
        for(auto i : array)//c++11语法,逐行遍历;
        {
            if(binary_search(i,target)) return true;//在本行二分找到了目标值
        }
        return false;
   }

};

题解三: 线性搜索
解题思路:利用二维数组行列递增特性
主要思路:

  1. 由于行列递增,可以得出:
    a.在一列中的某个数字,其上的数字都比它小
    b.在一行中的某个数字,其右的数字都比它大
  2. 搜索流程:
    a.首先从数组左下角搜索.
    b.如果当前数字大于target,那么查找往上移一位,如果当前数字小于target,那么查找往右移一位。
    c.查找到target,返回true; 如果越界,返回false;

示例如下:
图片说明

复杂度分析:
时间复杂度:O(M+N)
空间复杂度:O(1)

实现如下:

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        if(array.size() == 0)  return false;
        int r = array.size(); //行
        int l = array[0].size(); //列
        int left = 0, down = r - 1;
        while(left<l && down>=0)
        {
            int tmp = array[down][left];
            if( tmp == target) return true;
            else if(tmp < target) left++;
            else down--;
        }
        return false;
    }
};

题解四:双二分查找
解题思路: 利用数组行列递增特性。
主要思路:一维的二分查找可以舍弃一半的查找范围,二维的二分可以舍弃左上部分或者右下部分1/4的查找范围。

示例:
图片说明

复杂度分析:
时间复杂度:O(logM*logN)
空间复杂度:O(1)

实现如下:

class Solution {
public:
    bool double_binary(vector<vector<int>> arr,int x1,int x2,int y1, int y2,int target){
        if(x1 == x2 || y1 == y2) return false;
        int xmid = (x1+x2)/2, ymid = (y1+y2)/2;
        int num = arr[xmid][ymid];
        if(num == target) return true;
        if(num > target)
        {
           if(double_binary(arr, x1, xmid, y1, y2, target)) return true;
           if(double_binary(arr,xmid,x2,y1,ymid,target)) return true;
        }
        else
        {
            if(double_binary(arr, xmid+1, x2, y1, y2, target)) return true;
            if(double_binary(arr, x1, xmid+1, ymid+1, y2, target)) return true;
        }
        return false;
    }
    bool Find(int target, vector<vector<int> > array) {
        if(array.size() == 0) return false;
        return double_binary(array, 0, array.size(), 0, array[0].size(), target);
    }
};

此题同JZ1

牛客网编程题题解 文章被收录于专栏

本专栏记录在牛客网上AC的每一题,写下题解。 未来2年完成2000编程题的题解。 2021.12.29更新,最进准备毕设,断更了,会尽快做完毕设,继续做这一件事情

全部评论
大佬
1 回复 分享
发布于 2022-03-22 03:28
太牛了,专业啊
1 回复 分享
发布于 2022-07-29 11:18
高手来自民间,比官方分精选答案详细多了
4 回复 分享
发布于 2021-12-29 16:23
为啥第四种传入x2, y2不减1呢
1 回复 分享
发布于 2023-06-23 22:52 四川
大佬
点赞 回复 分享
发布于 2022-02-22 19:13
牛蛙
点赞 回复 分享
发布于 2022-03-01 11:09
大佬
点赞 回复 分享
发布于 2022-05-15 16:32
牛的
点赞 回复 分享
发布于 2022-05-28 10:43
很全面,Java版本也都写了一下,https://www.nowcoder.com/discuss/383959509952208896
点赞 回复 分享
发布于 2022-08-02 12:39
方法四空间复杂度是O(1)吗?
点赞 回复 分享
发布于 2022-08-18 11:55 北京
第四种解法把我绕晕了,而且O(logm*logn)比O(n)要好吗?
点赞 回复 分享
发布于 2022-09-01 14:19 广东
第三种方法假如只改变三行一列的值为3,且搜索3的话能找到么,这个算法成立的条件是不是当前位置左侧位置和上侧位置的值一样
点赞 回复 分享
发布于 2023-01-28 21:03 江苏
方法四太难了,理解不了
点赞 回复 分享
发布于 2023-02-20 02:20 广东

相关推荐

10-27 17:26
东北大学 Java
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
140
52
分享
正在热议
# 25届秋招总结 #
443459次浏览 4523人参与
# 春招别灰心,我们一人来一句鼓励 #
42266次浏览 539人参与
# 北方华创开奖 #
107475次浏览 600人参与
# 地方国企笔面经互助 #
7973次浏览 18人参与
# 同bg的你秋招战况如何? #
77249次浏览 569人参与
# 实习必须要去大厂吗? #
55816次浏览 961人参与
# 阿里云管培生offer #
120457次浏览 2220人参与
# 虾皮求职进展汇总 #
116310次浏览 887人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11702次浏览 289人参与
# 实习,投递多份简历没人回复怎么办 #
2455021次浏览 34861人参与
# 提前批简历挂麻了怎么办 #
149962次浏览 1979人参与
# 在找工作求抱抱 #
906124次浏览 9423人参与
# 如果公司给你放一天假,你会怎么度过? #
4764次浏览 55人参与
# 你投递的公司有几家约面了? #
33209次浏览 188人参与
# 投递实习岗位前的准备 #
1196058次浏览 18550人参与
# 机械人春招想让哪家公司来捞你? #
157650次浏览 2267人参与
# 双非本科求职如何逆袭 #
662406次浏览 7397人参与
# 发工资后,你做的第一件事是什么 #
12808次浏览 62人参与
# 工作中,努力重要还是选择重要? #
35929次浏览 384人参与
# 简历中的项目经历要怎么写? #
86943次浏览 1516人参与
# 参加完秋招的机械人,还参加春招吗? #
20154次浏览 240人参与
# 我的上岸简历长这样 #
452080次浏览 8089人参与
牛客网
牛客企业服务