描述
在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
数据范围:矩阵的长宽满足 0≤n,m≤500 , 矩阵中的值满足 0 ≤ val ≤10^9
示例1
输入
7 , [[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
输出
true
示例2
输入
3,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
输出
false
我的思路
类似于一个广度优先搜索+分支限界
第一步 在数组中找数,一行一行地找,
若是找到target,就返回true;
否则 找到>target的数,根据数组中元素大小的排列规律,需要跳到前一列,按照列竖着找,找到返回true;
如果找了一遍(遍历一遍)没有找到target,返回false;
public boolean Find(int target, int [][] array)
{
int R_h =array.length; //R_h 这个数组有几行
int R_l =array[0].length;//R_h这个数组有几列
//开始扫描 从行开始扫描,固定一行每一行的每一个元素扫描一遍;
for(int hang = 0;hang<R_h;hang++ )
{
for(int lie = 0; lie<R_l;lie++)
{
if(array[hang][lie]==target)
return true;//若有符合条件的,直接返回true;
//若有比大于target元素的array[hang][lie],根据题目所示的数组中元素的规律,
//说明目标值target只可能在该元素的前一列array[hang][lie-1]
//注意,如果是第0列,就没有前一列。
else if(array[hang][lie]>target&&lie>0)
{
//对该元素array[hang][lie]的前一列array[hang][lie-1]进行扫描,
for(int hang1=hang ; hang1<R_h;hang1++)
{
if(lie>0&&array[hang][lie-1]==target)
return true;
}
}
}
}
return false;
}
其实二分法会更好一点,但是需要思考怎么设计二分。
欢迎讨论,加油