[剑指offer学习心得]之:二维数组中的查找
2016-10-05 01:56
337 查看
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例子:
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
当我们需要解决一个复杂问题时,一个很有效的办法就是从一个具体问题入手,通过分析简单具体的例子,试图寻找普遍的规律。我们可以从数组的一个角上选取数字来和要查找的数字比较。得到以下规律:
选取数组中右上角的数字。如果该数字等于要查找的数字则查找过程结束;如果该数字小于要查找的数字,剔除这个数字所在行;如果该数字大于要查找的数字,剔除这个数字所在列。
就是说每一次都在数组的查找范围中剔除行或者列,酱紫每一步都可以缩小查找范围直到找到要查找的数字或者查找范围为空。
既然整个思路分析清楚了那么就可以着手写代码:
在此之前,首先考虑测试用例:
二维数组中包含查找的数字(查找的数字时数组中的最大值和最小值,查找的数字介于最大值和最小值之间)
二维数组中没有查找的数字(查找的数字大于数组中的最大值,查找的数字小于数组中最小值,查找的数字在数组的最大值和最小值之间但是数组中没有这个数字
特殊输入测试(二维数组为空)
得到的结果:
true
false
true
true
false
false
false
例子:
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
当我们需要解决一个复杂问题时,一个很有效的办法就是从一个具体问题入手,通过分析简单具体的例子,试图寻找普遍的规律。我们可以从数组的一个角上选取数字来和要查找的数字比较。得到以下规律:
选取数组中右上角的数字。如果该数字等于要查找的数字则查找过程结束;如果该数字小于要查找的数字,剔除这个数字所在行;如果该数字大于要查找的数字,剔除这个数字所在列。
就是说每一次都在数组的查找范围中剔除行或者列,酱紫每一步都可以缩小查找范围直到找到要查找的数字或者查找范围为空。
既然整个思路分析清楚了那么就可以着手写代码:
在此之前,首先考虑测试用例:
二维数组中包含查找的数字(查找的数字时数组中的最大值和最小值,查找的数字介于最大值和最小值之间)
二维数组中没有查找的数字(查找的数字大于数组中的最大值,查找的数字小于数组中最小值,查找的数字在数组的最大值和最小值之间但是数组中没有这个数字
特殊输入测试(二维数组为空)
public class Find { public static void main(String[] args){ int[][] matrix = { {1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15} }; System.out.println(find(matrix, 7)); // 要查找的数在数组中 System.out.println(find(matrix, 5)); // 要查找的数不在数组中 System.out.println(find(matrix, 1)); // 要查找的数是数组中最小的数字 System.out.println(find(matrix, 15)); // 要查找的数是数组中最大的数字 System.out.println(find(matrix, 0)); // 要查找的数比数组中最小的数字还小 System.out.println(find(matrix, 16)); // 要查找的数比数组中最大的数字还大 System.out.println(find(null, 16)); // 健壮性测试,输入空指针 } /** * * @param matrix 待查找的数组 * @param number 要查找的数 * @return 查找结果,true表示找到了,false表示没找到 */ private static boolean find(int[][] matrix,int number){ if(matrix==null||matrix.length<1||matrix[0].length<1){ return false; } int rows=matrix.length;//数组的行数 int cols=matrix[1].length;//数组的列数 int row=0;//起始行 int col=cols-1;//起始列 while(row<rows&&row>=0&&col>=0&&col<cols){ if(matrix[row][col]==number){//找到了就退出 return true; }else if(matrix[row][col]>number){//找到的数字比查找的数字大,剔除列 col--; }else{//找到的数字比查找的数字小,剔除行 row++; } } return false; } }
得到的结果:
true
false
true
true
false
false
false
相关文章推荐
- 《剑指offer》 学习笔记(二): 二维数组中的查找
- 《剑指Offer》学习笔记--面试题3:二维数组中的查找
- 剑指offer-3/1384二维数组中的查找
- 剑指offer:面试题03---二维数组的查找
- 剑指Offer:面试题3 二维数组中的查找
- 剑指offer面试题3-二维数组中的查找
- 剑指offer(2) - 二维数组中的查找
- 韩顺平_轻松搞定网页设计(html+css+javascript)_第28讲_js二维数组_js冒泡排序_二分查找_学习笔记_源代码图解_PPT文档整理
- (剑指Offer)面试题3:二维数组中的查找
- 剑指offer 面试题3 二维数组的查找
- 《剑指offer》学习心得第四日
- 《剑指Offer》面试题-二维数组中的查找
- 九度《剑指Offer》面试题3 二维数组中的查找
- 杨氏矩阵的查找(二维数组中的查找——剑指offer3)
- 剑指Offer之二维数组中的查找
- 剑指Offer - 九度1384 - 二维数组中的查找
- 《剑指offer》面试题三 二维数组中的查找
- 剑指Offer:二维数组中的查找
- 剑指offer系列源码--二维数组中的查找
- 剑指offer 3 -二维数组中的查找