1.问题描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
2.算法分析
二维数组特点:每一行都是递增有序,每一列都是递增有序。
根据二维数组的特点,查找一个待定元素target,首先与array[i][j]比较。结果分以下三种情况:
(1)target == array[i][j],返回true
(2)target > array[i][j]。此时,target在array[i][j]的右下部分区域
(3)target < array[i][j]。此时,target在array[i][j]的左上部分区域
综上,由于行和列的方法都可变,查找的区域较大。那么,有没有一种方式可以减少待查元素变化的范围,将其按照行和列变化转化为只按照行变化或者只按照列变化。因此,可以采用降维的方式来处理该问题。
3.算法设计
首先,定义可用变量:
int[][] array : array数组,表示待查找集合
int colLength :列的长度
int rowLength:行的长度
int row : 表示行下标,取值范围(0-array.length-1)。初值为array.length-1
int col : 表示列下标,取值范围(0-array[0].length-1)。初值为0
比较过程:target与array[row][col]比较。结果分为以下三种情况:
(1)target == array[row][col],返回true
(2)target > array[row][col]。此时,target在array[row][col+1]到array[row][colLength-1]之间
(3)target < array[row][col]。此时,查找上一行元素
此时,降维了。选取的待比较元素从行最大列最小开始,那么当target大于array[i][j]时,可以沿着列的方向继续比较。
4.代码实现
public boolean find(int[][] array, int target){
int rowLength = array.length;
int colLength = array[0].length;
int row = rowLength -1;
int i=0;
while(row>=0 && i< colLength){
if(array[row][i] > target){
row--;
}else if(array[row][i]<target){
i++;
}else {
return true;
}
}
return false;
}