版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CSDN_Kzy/article/details/88666383
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
二维数组 如下所示:
1 2 3
4 5 6
7 8 9
解题思路
第一种:暴力求解法
遍历每一行直到找到目标数字
public class Solution {
public boolean Find(int target, int [][] array) {
//外层遍历纵坐标
for(int i = 0;i <= array.length-1;i++){
//内层遍历横坐标
for(int j = 0;j <= array[0].length-1;j++){
//寻找目标数字
if(target == array[i][j]){
return true;
}
continue;
}
}
return false;
}
}
第二种:左下右上法(左下法)
因为该二维数组是有序排列的,因此每行的开头和结尾是该行最小或最大的值,用目标数字和最后一行的开头进行比较,如果目标数字比其大,那么继续横向比较,如果比其小,则减少行数比较下一行的开头值
扫描二维码关注公众号,回复:
5589452 查看本文章
public class Solution {
public boolean Find(int target, int [][] array) {
//左下法
int rowCount = array.length;
int colCount = array[0].length;
int i = rowCount - 1;
int j = 0;
//确保不会跑出边界,所以用&&运算
while(i >= 0 && j <= colCount - 1){
if(target > array[i][j]){
j++;
continue;
}else if(target < array[i][j]){
i--;
continue;
}else{
return true;
}
}
return false;
}
}
总结:第二种方式显然比暴力法会遍历更少的数据量,理论来说应该效率更高,但是如上图测试结果来分析,造成这种情况的可能性如下:1.二维数组数据量大小 2.目标数字在二维数组的位置 3.定义变量的数量
知识点:
二维数组获取边界的写法
int rowCount = array.length; //获取纵坐标边界长度
int colCount = array[0].length; //获取横坐标边界长度
控制边界,循环确定边界时要小心,二维数组必须满足横纵都在边界内才行
while(i >= 0 && j <= colCount - 1) //&& 同时为true || 任一为true