【剑指Offer】二维数组中的查找
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解法1
最简单的思路,就是暴力遍历,for循环遍历数组所有元素,判断该整数是否存在。再利用题目给出的每一行递增,每一列递增的两个特点进行优化。当查找到某行的第一列的元素就已经比目标整数大了,就不用再继续进行遍历了,因为后面行的所有元素都会比目标整数大。同理,当查找到某行某列的元素已经比目标整数大了,也可以不用再遍历该列后面的所有列了,因为后面的所有列都会比目标整数大。
实现代码
public bool Find(int target, int[][] array)
{
if (array.Length > 0 && array[0].Length > 0)
{
int col = array[0].Length;
for (int i = 0; i < array.Length; i++)
{
if (array[i][0] > target)
{
// 该行后面的所有行将不再遍历
break;
}
for (int j = 0; j < col; j++)
{
if (array[i][j] == target)
{
return true;
}
else if (array[i][j] > target)
{
// 该列后面的所有列将不再遍历
col = j;
break;
}
}
}
}
return false;
}
需注意的问题
这道题我在第一次提交的时候未通过,原因是忘记判断二维数组中元素为0的情况。以后需要格外留心类似这种为空或为0的特殊情况
解法2
我们可以通过本题二维数组每行递增,每列递增的特点,总结出相关规律,如下所示。可以发现,如果从数组的左下角或右上角观察,数组是有序的。这里以左下角为例,向右的话元素递增,向上的话元素递减。即从左下角开始查找,当目标整数比左下角数字大时右移(比目标整数大的一定在其右边),比左下角数字小时上移(比目标整数小的一定在其上面)。
[12345246810459121389101112]
\left[
\right]
⎣⎢⎢⎡12482459369104812115101312⎦⎥⎥⎤
实现代码
public bool FindOptimize(int target, int[][] array)
{
int row = array.Length - 1;
int col = 0;
while(row >=0 && col < array[0].Length){
if(array[row][col] == target)
{
return true;
}else if(array[row][col] > target)
{
row--;
}
else
{
col++;
}
}
return false;
}
更多题目的完整描述,AC代码,以及解题思路请参考这里https://github.com/iwiniwin/Algorithm
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!