题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
1.暴力法
依次遍历数组中的每一个数,若找到,则返回true;查找失败,则返回false。
//暴力法
public class Solution {
public boolean Find(int target, int [][] array) {
for(int i=0;i<array.length;i++)
{
for(int j=0;j<array[0].length;j++)
{
if(array[i][j]==target)
{
return true;
}
}
}
return false;
}
}
时间复杂度:O(n2)
2. 从边角开始查找
有左上、左下、右上、右下四个角。a是最大值,l是最小值。
(1)左上/右下
以左上为例,比较 a 与 target,若:
- a > target, 则target不存在,返回false。
- a < target, 则继续遍历查找。
- a = target, 则查找成功,返回true。
右下同理,此方法相较于暴力法并无太多的改进。时间复杂度仍然为O(n2)。
(2)左下/右上
以左下为例,可知左下值为最后一行的最小值且为第一列的最大值。
因此,比较j与target,若:
- j > target,则只需要查找该一行即可,列数增加。
- j < target,则需要向上移动一行,行数减少。
- j = target,查找成功,返回true。
此方法,每次比较都可剔除一行/一列,相较于以上,该方法的时间复杂度为O(行数+列数)。
//从左下开始
public class Solution {
public boolean Find(int target, int [][] array) {
int row_length=array.length;
int col_length=array[0].length;
int col=0;
int row=row_length-1;
while(col<col_length && row>=0)
{
if(array[row][col]<target)
{
col++;
}
else if(array[row][col]>target)
{
row--;
}
else
{
return true;
}
}
return false;
}
}
总结
一个小的点:Java获取二维数组行列长度
- 获取行数 rowLength = array.length
- 获取列列 colLength = array[0].length
来源:CSDN
作者:专业修电脑
链接:https://blog.csdn.net/weixin_43866225/article/details/104172824