剑指Offer 15.二维数组中的查找

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。

请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
数据范围

二维数组中元素个数范围 [0,1000]

样例

输入数组:

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

如果输入查找数值为7,则返回true,

如果输入查找数值为5,则返回false



问题思考:

判断目标值和右上角的大小关系,
目标值>右上角 判断下一行

目标值<右上角 删去右上角的列

目标值=右上角的值 返回

其中 三个条件的顺序是有影响的。 这个放在文章最后。


class Solution {
public:
    bool searchArray(vector<vector<int>> array, int target) 
    {
       if(array.empty()||array[0].empty()) return false;
       int i=0,j=array[0].size()-1;
       while(i<array.size()&&j>=0)
       {
           int x=array[i][j];
           if(x==target) return true;  //如果是求下标 return array[i][j];
           if(x>target) j--;
           else i++;
       }
       return false;
    }
};

时间复杂度 O(m+n) (m,n指的是数组行列数)

数组是否为空和数组中的元素是否为空是两个不同的概念,需要区分开来。

一个数组是否为空通常指的是它是否包含任何元素。例如,在 C++ 中,可以使用 array.empty() 方法来检查数组是否为空。如果数组中没有任何元素,该方法将返回 true,否则返回 false。

一个数组中的元素是否为空通常指的是该元素是否有实际值或存在某种特定的状态。具体来说,对于像 C++ 这样的静态类型语言,数组中的每个元素都必须具有某种类型,例如 int 或 std::string。如果数组中的某个元素没有赋值,则它可能被认为是“空”的。另外,在一些情况下,我们可能需要使用特殊值(例如 nullptr)来表示某个元素的“空”状态。

需要注意的是,一个非空的数组中仍然可能包含“空”的元素。

因此,我们需要区分数组是否为空和数组中的元素是否为空这两个概念。

求最少需要多少场赛跑,可以求出其中跑的最快的三头猪。
(最少多少场可以百分百保证求出正确结果)
答案: 9场。

和这个题有一点点像(相关)
三叶虫也能看懂的Unity面试题一日一讲




Q: 这个其中的 int x=array[i][j]; if(x==target) return true; //如果是求下标 return array[i][j]; if(x>target) j--; else i++; 先后顺序,有影响嘛? 如果不修改其他代码,只修改先判断是否大于或者小于,再判断是否等于,好像是不对的。
A: 先后顺序对代码的正确性是有影响的。因为在二维数组中,每行和每列都是递增的,所以我们可以根据目标值和当前值的大小关系来缩小搜索范围,从而提高查找效率。如果先判断是否大于或小于目标值,再判断是否等于目标值,则会导致有些情况下会漏掉目标值。

举个例子,假设目标值是5,而当前位置的值是6。如果先判断是否大于或小于目标值,再判断是否等于目标值,那么程序会走到j--的分支,从而忽略了可能存在于当前行其他位置的值为5的情况。因此,应该先判断是否等于目标值,再根据大小关系来缩小搜索范围。

posted @ 2023-03-19 00:10  专心Coding的程侠  阅读(32)  评论(0编辑  收藏  举报