面试题1: 二维数组中查找

本题出自《剑指offer 名企面试官精讲典型编程题》面试题3。

题目3:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列按照从上到下递增的顺序排序。请完成一个函数,输入一个这样的二维数组和整数,判断数组中是否含有该整数。

例如下面的二维数组就是每行每列递增排序。如果在数组中查询7,则返回true;如果查找数字14,由于数组中不包含14,则返回false。

解决方法分析:

首先我们选取二维数组左下角的数字8,由于8大于7,并且8还是第四行的第一个数,因此数字7不可能出现在8所在的行,于是我们把这一行从需要考虑的区域中剔除,之后需要分析的只剩下3行。在剩下的矩阵中,位于左下角的数字是4,4小于7,可以把4所在的列从需要考虑的区域中剔除。接下来只需要分析剩下的3行3列即可。同理,可以照之前处理方式继续处理。

处理过程如下图所示:

注:矩阵灰色区域为下一步要查找的范围,绿色为所要查找的数字。

整个算法的逻辑:

首先选取数组左下角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的行;如果该数字小于要查找的数字,剔除这个数字所在的列。也就是说,每次剔除一行或一列来缩小查找范围,直至找到要查找的数字,或者查找对应数字失败!

当然除了选择左下角的数字外,也可以选择右上角的数字,查找方法类似。

下面我以Java为编程语言,展示上述算法的处理过程。

 1 package array;
 2
 3 /**
 4  * @author WuPing
 5  * @version 2016年4月7日 下午7:11:44
 6  */
 7
 8 public class FindInPartiallySortedMatrix {
 9
10     public static boolean FindNumber(int[] matrix, int rows, int columns,
11         int number) {
12     boolean found = false;
13     if (matrix != null && rows > 0 && columns > 0) {
14         //以二维数组左下角的数为查找比对标准
15         int row = rows - 1;
16         int column = 0;
17         while (row >= 0 && column < columns) {
18         if (matrix[row * columns + column] == number) {
19             found = true;
20             break;
21         } else if (matrix[row * columns + column] > number) {
22             --row;
23         } else {
24             ++column;
25         }
26         }
27     }
28     return found;
29     }
30
31     public static void Test(String testName, int[] matrix, int rows,
32         int columns, int number, boolean expected) {
33     if(testName != null) {
34         System.out.print(testName + " begins: ");
35         boolean result = FindNumber(matrix, rows, columns, number);
36         if(result == expected) {
37         System.out.print("Passed.");
38             System.out.println();
39         }
40         else {
41         System.out.print("Failed.");
42             System.out.println();
43         }
44     }
45     }
46
47     public static void main(String[] args) {
48     //此处以一维数组加行数和列数的形式表示二维数组
49     int[] matrix = {1, 3, 6, 9, 2, 5, 7, 11, 4, 10, 13, 16, 8, 12, 15, 18};
50
51     //要找的数在二维数组中,但不在左上角或右下角
52     Test("Test1", matrix, 4, 4, 7, true);
53
54     //要找的数不在二维数组中,但在数组范围内
55     Test("Test2", matrix, 4, 4, 14, false);
56
57     //要找的数在二维数组左上角
58     Test("Test3", matrix, 4, 4, 1, true);
59
60     //要找的数在二维数组右下角
61     Test("Test4", matrix, 4, 4, 18, true);
62
63     //要找的数在二维数组范围下界外
64     Test("Test5", matrix, 4, 4, 0, false);
65
66     //要找的数在二维数组范围上界外
67     Test("Test6", matrix, 4, 4, 20, true);
68
69     //传递的二维数组为空
70     Test("Test7", null, 4, 4, 20, false);
71
72     }
73
74 }

代码执行结果如下:

时间: 2024-10-06 22:36:51

面试题1: 二维数组中查找的相关文章

面试题03_二维数组中查找_剑指offer系列

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 解题思路: 这是一道考查二维数组的理解和编程能力的题. 在二维数组在内存中是连续存储的.在内存中从上到下存储各行元素,在同一行中按照从左到右存储. 因此可以按照行号和列号来计算出相对数组首部的位置. 由于每一行 和 每一列都是有序的,因此,我们可以拿要查找的数与数组的右上角的数进行比较. 因为每一行从左到右递增,每一列

剑指offer 面试题(二维数组中的查找) (2)

面试题: 二维数组中的查找 /* 题目:   在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成 一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该数. */ ps:(其实前段时间我就做过这道题,今天看到了,觉得还是有点生,那就再来一次吧) 题目分析:  在分析这个问题的时候,我们首先要看,在一个二维数组中查找一个数字是否存在,那么很多人就觉得 简单了,遍历二维数组与所需要查找的数字进行比较不就完了!  不可否认的是你说的是可行的,可是

【剑指Offer面试题】二维数组中的查找

下决心AC所有剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有好处的.加油~ 二维数组中的查找 时间限制:1 秒内存限制:32 兆 特殊判题:否提交:19005解决:3642 题目描述: 在一个

【剑指offer】面试题 4.二维数组中的查找

面试题 4. 二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 举例 例如下面的二维数组就是每行.每列都递增排列.如果在这个数组中查找数字7,则返回true;如果查找数字5,由于 数组不含有该数字,则返回false. 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 复杂度:O(M + N) + O(1) 代码实现 public

《剑指Offer》面试题:二维数组中的查找

题目 题目:在一个二维数组中,每一行都按照从左到右的顺序进行了排序,每一列都按照从上到下进行了排序. 输入这样的一个二维数组arr和一个整数k,判断数组中是否存在这个数. 思路 由于数组时有序的这样一个前提,因此 从右上角开始查找 :如果要查找的数比右上角的值大,则查找范围删除掉(并不是实际的删除,只需要改变下标即可)这一行,如果要查找的数比右上角的值小,则查找范围删除掉这一列:这样就可以将查找范围逐渐缩小,直至完成搜索 当然也可以从右下角开始查找,但是不可以从左上角或者是左下角开始查找(因为这

面试题3 ----二维数组中的查找

题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 在剩下的两行两列4个数字中,位于右上角的刚好就是我们要查找的数字7,于是查找过程就可以结束了. 矩阵的加阴影背景的区域是下一步查找的范围.代码如下: bool Find(int* matrix,int  rows,int columns,int number) { bool found = false; if (matri

剑指offer_面试题3_二维数组中的查找(简单问题亦不能忽视)

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样一个二维数组和一个整数,判断数组中是否含有该整数. 数组如下: 在该数组中查找一个整数隐含的几个规律: 1.在数组中选取一个数,如果与所查目标相等,那么查找结束 2.若所选数字,小于,要查找的目标,则要查找的目标应该在当前选取的位置的右边或者下边 3.若所选数字,大于,要查找的目标,则要查找的目标应该在当前选取的位置的左边或者上边 问题关键如何在该数组中选取整数? 答:在一行中,

【剑指Offer学习】【面试题:二维数组中的查找】PHP实现

最近一直看剑指Offer.里面很多算法题.于是就想着用PHP来显示一下. 题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 拿到这个题目.我们第一个反应,就是遍历二维数组.然后逐个进行比较.我们不难用PHP进行实现.于是有了下面的代码 1 function TwoArrayFind($array,$search) { 2 $found = false; 3 4 if(e

面试题2:二维数组中的查找

题:在每一行从左到右递增,每一列从上到下递增,二维数组的查找重点在于从右上角开始找 #include <iostream>using namespace std;#define COLS 4#define ROWS 4bool findInPartiallySortedMatrix(int *A,int key){ bool f=false; int col=COLS-1,row=0; if(A!=NULL&&COLS>0&&ROWS>0) { wh