欢迎和小白一起成长,985计算机硕士,有任何学习,保研等问题都可以公众号私信留言哦!
微信搜索:三喂树屋
剑指offer刷题系列[04],欢迎一起学习
题目描述
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例
现有矩阵 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 = 8,返回 true。
给定 target = 20,返回 false。
思路
先看一下矩阵的规律,仔细观察矩阵,可以发现:左下角元素为所在列最大元素,所在行最小元素;右上角元素为所在行最大元素,所在列最小元素。依照此规律,可以有如下查找思路
选择矩阵最左下角的元素为初始元素(你也可以选择右上角的元素为起始元素,逻辑类似),如果 左下角元素大于了目标值,则目标值一定在该行的上方, 此时我们向上一行查找;如果左下角元素小于了目标值,则目标值一定在该列的右方, 此时我们向后一列查找。
代码实现
/**
* @author:三喂树屋
* @2022/3/26 15:33
* 文件信息:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,
* 每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组
* 和一个整数,判断数组中是否含有该整数。
*/
public class findNumberIn2DArray {
public static boolean solution(int[][]matrix,int target){
int i = matrix.length-1;
int m = matrix[0].length;
int j = 0;
while (i>=0&&j<m){//从左下角元素开始查找
if (matrix[i][j]>target){//左下角元素较大,则目标元素必然在i上面的某一行(如果存在
i--;
}else if (matrix[i][j]<target){//左下角元素较小,则目标元素必然在j右面的某一列(如果存在
j++;
}else {//目标元素找到
return true;
}
}
return false;
}
public static void main(String[] args) {
int[][] matrix = new int[][]{{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}
};
System.out.println(solution(matrix,28));
}
}
图解过程
1. 目标值target=5,起始位置为左下角的元素18
2. 18和5比较,大于5,则执行i–,向上移动一行
3. 10和5比较,大于5,则执行i–,向上移动一行
4. 3和5比较,小于5,则执行j++,向右移动一列
5. 6和5比较,大于5,则执行i–,向上移动一行
至此,查找结束。