二维数组中的查找

简介: 二维数组中的查找

前言

本文只供自己学习做笔记留存,未经过很详细的梳理。谨慎阅读!!!

描述

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

[

[1,2,8,9],

[2,4,9,12],

[4,7,10,13],

[6,8,11,15]

]

给定 target = 7,返回 true。

给定 target = 3,返回 false。


数据范围:矩阵的长宽满足 0≤n,m≤5000≤n,m≤500 , 矩阵中的值满足 0≤val≤10^9

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

例子

7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]] 返回true

1,[[2]] 返回 false

方法1:暴力循环,(13ms,1191kb)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param target int整型 
     * @param array int整型vector<vector<>> 
     * @return bool布尔型
     */
     //时间复杂度 O(n*n)
    bool Find(int target, vector<vector<int> >& array) {
        if(array.empty())return false; //如果为空直接返回false
        for(int row = 0;row<array.size();++row){
            auto tempele = array[row];
            if(tempele.empty())continue;
            for(const auto currval :tempele){
                if(currval == target)
                return true;
            }
        }
        return false;
        // write code here
    }
};

方法2: 二分法,(13ms,1184kb)

  1. 左闭右闭
  • while(left<=right) 为何使用<= ,因为闭区间里left==right有效
  • if(nums[middle]>target)right=middle - 1;因为第middle个值在此不等于target,所以右边界赋值时索引用midle-1。
#include <vector>
class Solution {
public:
    //二分查找
    bool search(int target,vector<int> array){
        //采用左闭右闭解法
        int left  = 0;
        int right = array.size() - 1;
        while(left<=right){
            int middle  = left +( (right - left)/2);
            if(array[middle]>target){
                right = middle - 1;
            }else if(array[middle]<target){
                left = middle +  1;
            }else{
                return true;
            }
        }
    return false;
    }
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param target int整型 
     * @param array int整型vector<vector<>> 
     * @return bool布尔型
     */
     //时间复杂度 O(n*n)
    bool Find(int target, vector<vector<int> >& array) {
        if(array.empty())return false; //如果为空直接返回false
        for(int row = 0;row<array.size();++row){
            auto tempele = array[row];
         if(search(target,tempele))return true;
        }
        return false;
        // write code here
    }
};

总结

本题的数据都是有序的,很明显可以用二分法。更深一步的学习了二分法的细节。防止混淆以后只用一种:左闭右闭的二分法。

目录
打赏
0
0
0
0
0
分享
相关文章
二维数组的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。        当我们需要解决一个复杂的问题时,一个很有效的办法就是从一个具体的问题入手,通过分析简单具体的例子,试图寻找普遍的规律。
488 0
【17】二维数组中的查找
题目:在一个二维数组中,每一行都按照从从左到右递增的顺序排序,每一列按照从上到下的顺序递增排序。输入一个这样的二维数组arrNum和一个整数value,判断二维数组是否含有该整数 方案一:最朴素的方法枚举整个数组,时间复杂度O(n^2),效率太低 方案二:观察这个数组的特点就是每行每列都是递增的顺序。
946 0
1、 在一个排序的二维数组中,查找某个整数
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
108 0
剑指offer_数组---二维数组中的查找
剑指offer_数组---二维数组中的查找
89 0
剑指offer 03. 二维数组中的查找
剑指offer 03. 二维数组中的查找
90 0
[剑指offer] 二维数组中的查找
本文首发于我的个人博客:尾尾部落 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
988 0
剑指Offer_4_二维数组中的查找
题目描述       在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。      例 :     1   2    8     9      2   4    9    12      4   7   10   13      6   8   11   15     在这个数组中查找数字 9 ,  则返回true 。
1034 0
剑指Offer04二维数组中的查找
剑指Offer04二维数组中的查找

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等