题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如:下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true;如果查找数字5,由于数组中不含有该数字,则返回false。
1 | 2 | 8 | 9 |
2 | 4 | 9 | 12 |
4 | 7 | 10 | 13 |
6 | 8 | 11 | 15 |
思路:由于要在牛客网上在线提交测试,便不考虑暴力遍历解法(代码行极少,却很费时)。
采用《剑指Offer》书中的思路:首先选取数组右上角(或者是左下角,同理)的数字,如果该数字等于要查找的数字,则查找过程结束;如果该数字大于要查找的数字,则剔除这个数字所在的列,向左搜寻(缩小范围);如果该数字小于要查找的数字,则剔除这个数字所在的行,向下搜寻。
参考书中C++的实现代码,对应Java实现代码如下所示,牛客网在线提交通过(ps:在牛客网上泡的时间也不短了,第一次在线提交编程题,汗-_-||)。
public class Solution {
public boolean Find(int target, int [][] array) {
int rows = array.length; //二维数组的行长度
int cols = array[0].length; //二维数组的列长度
if(array != null && rows > 0 && cols > 0) {
int row = 0;
int col = cols - 1;
while(row < rows && col >= 0) {
int temp = array[row][col];
if (temp > target) {
col--; //待查找的数小于“角值”时,则行不变列-1向左搜寻
}
else if (temp < target) {
row++; //待查找的数大于“角值”时,则列不变行+1向下搜寻
}
else {
return true;
}
}
}
return false;
}
}
PS:第一次写博客还是有点小激动,之前遇到技术问题,总是喜欢找各路大神博客,心中各种崇拜,但是问题解决以后却从没有总结心得体会,经验教训。面临找工作,才发现技术博客的重要性,以后将刷到的题目(虽然都很简单,原谅小白的猥琐发育把)都写成博客记录下来,也算是个人的一片独立王国吧。