二维数组中的查找(java)
题目描述:
在一个n*m的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
限制:0 <= n <= 1000;0 <= m <= 1000
样例:
现有矩阵matrix如下:
{
{1, 4, 7, 11, 15},
{2, 5, 8, 12, 19},
{3, 6, 9, 16, 22},
{10, 13, 14, 17, 24},
{18, 21, 23, 26, 30}
}
给定target = 5,返回true
给定target = 20,返回false
题解:
暴力解法太暴力了,最开始的思路:(说行啊列呀的就假装他是个矩阵吧)查找第一行,找出target可能出现的列,再查找那些列。
比如target=5吧,第一行1,4,都小于5,所以target可能出现在这两列。就在这两列种进行查找(先4后1)。
想着觉得自己很对,写的时候就发现问题了,处理起来太麻烦,由于要多次在一维数组中查找,还额外写了一个二分查找的函数用来调用,后来发现二分查找找多个数处理起来有点麻烦就换成了遍历,,折腾来折腾去弄了好长,编译器弄运行出来了,力扣还不承认。跪了
然后学习了大佬的思想:
选一个角开始查找,这个角必须是左下角或右上角,因为这两个角横向进行还是竖向进行是有区分的(右上角为例,横向减少,竖向增加)。
比较过程中如果大于target就横向进行排除此列,如果小于target就竖向进行排除此行。
画了个图形象点:
代码:
两个代码一对比,浓缩的都是精华 ,是我努力的方向。
public static boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix.length == 0)
return false;
int r = 0;
int c = matrix[0].length - 1;
while(r <matrix.length && c >= 0) {
if(matrix[r][c] == target) {
return true;
}else if(matrix[r][c] > target) {
c --;
}else if(matrix[r][c] < target) {
r ++;
}
}
return false;
}
笨的(留个纪念)
//二维数组中的查找
//太垃圾了我写的这都是些什么
public static boolean findNumberIn2DArray(int[][] matrix, int target) {
int rmid = binarySearch(matrix[0],target);
boolean result = false;
if(rmid == -1) {
result = false;
}else if(matrix[0][rmid] == target) {
result = true;
}else {
int[] alone = new int[matrix.length];
while(rmid >= 0){
//循环把rmid左侧的列都查找一下
for(int i = 0;i < matrix.length;i ++){
//循环把rmid列的数都放进alone数组里
alone[i] = matrix[i][rmid];
}
int cmid = binarySearch(alone,target);
if(matrix[cmid][rmid] == target){
result = true;
break;
}
rmid --;
}
}
return result;
}
public static int binarySearch(int[] alone,int target) {
int result = -1;
if(alone[0] <= target) {
for(int i = 1;i < alone.length;i ++) {
if(alone[i] == target) {
result = i;
break;
}else if(alone[i] > target) {
result = i-1;
break;
}else if(i == alone.length-1) {
result = i;
}
}
}
return result;
}