当前位置: 首页 > 科技观察

LeetCode题解-二维数组搜索

时间:2023-03-15 09:31:44 科技观察

在二维数组中搜索在一个n*m的二维数组中,每一行从左到右升序排列,每一列从顶部升序排列tobottom按顺序排序。请完成一个高效的函数,输入这样一个二维数组和一个整数,判断数组中是否包含整数。例:现有矩阵矩阵如下:[[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]]给定target=5,返回true。给定target=20,返回false。限制:0<=n<=10000<=m<=1000解1很简单理解,一个二维数组和一个数。检查数组中是否存在该数字。另外还有一个建议就是每一行每一列都是递增的数字,后面会看到这道题怎么用。如果只是在数组中查找数字,那么很容易想到直接遍历。classSolution{publicbooleanfindNumberIn2DArray(int[][]matrix,inttarget){if(matrix==null||matrix.length==0||matrix[0].length==0){returnfalse;}introws=matrix.length,columns=matrix[0].length;for(inti=0;imatrix[i][middle]){left=middle+1;}else{right=middle-1;}}}returnfalse;}}方法消耗执行时间:0-1ms内存消耗:44.4MB时间复杂度大家应该都知道二分法的复杂度,O(logn)。具体算法为N*(1/2)^x=1,得到x=logn,基数为2。所以在外面放一个循环,总时间复杂度为O(mlogn),基数为2空间复杂度由于没有使用与n相关的额外空间,因此空间复杂度为O(1)。方案三不过刚才的方案还是没有充分利用题目的特点。这个二维数组不仅对每一行进行了排序,而且还对每一列进行了排序。那么,如何解决呢?我们可以把这个数组转45度角来看:[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]151119712224816241591730...下面就不写了,像二叉树结构吗?还有左分支的每个节点必须小于此元素,右分支必须大于此元素。那么根据这个特点,我们可以写一个更简单的算法,就是从第一行的最后一个数开始,依次和目标值进行比较。如果目标值大于节点数,则将节点下移,即行数+1。如果目标值小于这个节点数,则将节点向左移动,也就是列号-1。classSolution{publicbooleanfindNumberIn2DArray(int[][]matrix,inttarget){inti=matrix.length-1,j=0;while(i>=0&&jtarget)i--;elseif(matrix[i][j]