剑指 Offer 04. 二维数组中的查找
剑指 Offer 04. 二维数组中的查找
题目描述
在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
0 <= n <= 1000
0 <= m <= 1000
解法
1.暴力for循环 时间复杂度O(n*m) 空间复杂度O(1) 不推荐
2.n行分别进行二分查找 时间复杂度O(nlogm) 空间复杂度O(1) 优于第一种
3.模拟一个初始结点从数组的左下角开始,当要找的数大于该结点时结点往右边移动一下,当要找的数小于该结点时将结点往上移动一下。重复直到得出结果。 时间复杂度O(n + m) 空间复杂度O(1)
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
//注意到题目给出的n与m的范围,要进行边界处理
if (matrix == null || matrix.length <= 0 || matrix[0].length <= 0){
return false;
}
int rows = matrix.length - 1;
int x = matrix[0].length - 1; //记录行的定值
int cols = matrix[0].length - 1;
while (rows >=0 && cols >=0){
if (target < matrix[rows][x - cols]){
rows--;
}else if (target > matrix[rows][x - cols]){
cols--;
}else {
return true;
}
}
return false;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)