题目描述:在一个二维数组中,每一行都是按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:利用该二维数组的特性(行列都是递增的),用所查整数与右上角的元素进行比较,如果所查整数小于右上角数值(该元素为第一行的最大元素,最后一列的最小元素),则列col--,否则,行row++,查找结束的时候,如果还未返回,即可认为不存在。(此为解法一,解法二,请往后看!)
二维数组的复习:
//定义一个整型数组:
2行3列 int data[][] = new int[2][3];
//获取行数---2行
int row = data.length;
//获取列数---3列
int col = data[0].length;
二维数组可以抽象理解为其本身就是一个一维数组,不过它的元素比较特殊,即每个元素都为一维数组。
data[0][0] data[0][1] data[0][2]
data[1][0] data[1][1] data[1][2]
详细代码:
public class Exercise5 {
public static boolean findNumber(int data[][],int target){
//定义二维数组的行数
int row = 0;
//定义二维数组的列数
int col = data[0].length - 1;
//通过while循环控制
while(row < data.length && col >= 0){
//所查元素小于右上角元素,col--
if(data[row][col] > target){
col--;
}else if(data[row][col] < target){
//所查元素大于右上角元素,row++
row++;
}else{
return true;
}
}
return false;
}
public static void main(String[] args) {
int data[][] = {{1,2,3},{4,5,6},{7,8,9}};
boolean temp = findNumber(data,7);
System.out.println(temp);
}
}
解法二:利用两层for循环,遍历数组,再用if语句判断数组元素是否与所查找元素相等即可,外层for循环控制行数,内层for循环控制列数,遍历结束之后,如果没有,返回false。
public class Exercise5 {
public static void main(String[] args) {
int data[][] = {{1,2,3},{4,5,6},{7,8,9}};
boolean temp = findNumber(data,7);
System.out.println(temp);
}
//普通for循环写法
private static boolean findNumber(int[][] data, int i) {
//外层for循环控制行数
for (int j = 0; j < data.length; j++) {
//内层for循环控制列数
for (int k = 0; k < data[0].length; k++) {
if(data[j][k] == i){
return true;
}
}
}
return false;
}
//foreach写法
/* private static boolean findNumber(int[][] data, int i) {
//循环输出行
for (int[] row:data) {
//循环输出列
for (int col:row) {
//判断所查元素和列中元素是否相等
if(col == i){
return true;
}
}
}
return false;
}*/
}
foreach复习:
for(数据类型 临时变量 : 数组(集合)) {
// 循环次数为数组长度,而每一次循环都会顺序取出数组中的一个元素赋值给临时变量
}
即在for循环里面无须使用索引来取数据。
心灵鸡汤:不要羡慕别人,终有一天你会成为别样仰望的人,在此之前,你唯有努力!