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

题目描述:

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

解题思路:

这是一道考查二维数组的理解和编程能力的题。

在二维数组在内存中是连续存储的。在内存中从上到下存储各行元素,在同一行中按照从左到右存储。

因此可以按照行号和列号来计算出相对数组首部的位置。

由于每一行 和 每一列都是有序的,因此,我们可以拿要查找的数与数组的右上角的数进行比较。

因为每一行从左到右递增,每一列从上到下递增。

所以查找一个数num,可以这样做:

首先拿num与右上角的数进行比较。

若相等,则直接返回,找到该数。

若num < 右上角数,则剔除右上角数所在列 col--

若num > 右上角数,则剔除右上角数所在行 row++

有了这个思路,我们就可以进行写代码了。

其实,还可以选择与左下角的数进行比较。方法与上述跟右上角数比较一样。

代码实现:

<span style="font-size:18px;">class Solution {
public:
	bool Find(vector<vector<int> > array, int target) {
		bool ans = false;
		int Row_len = array.size();//获取行数
		int Col_len = array[0].size();//获取列数

		if (!array.empty() && Row_len > 0 && Col_len >0)
		{
			int row = 0;//下标从零开始
			int col = Col_len - 1;//同样下标从零开始
			while (row < Row_len && col>= 0) //这里注意 col >= 0,不要漏掉=号
			{
				if (array[row][col] == target)
				{
					ans = true;
					break;
				}
				else if (array[row][col] > target)
					--col;
				else
					++row;
			}
		}
		return ans;
	}
};</span>

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-24 02:42:40

面试题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

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

本题出自<剑指offer 名企面试官精讲典型编程题>面试题3. 题目3:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列按照从上到下递增的顺序排序.请完成一个函数,输入一个这样的二维数组和整数,判断数组中是否含有该整数. 例如下面的二维数组就是每行每列递增排序.如果在数组中查询7,则返回true:如果查找数字14,由于数组中不包含14,则返回false. 解决方法分析: 首先我们选取二维数组左下角的数字8,由于8大于7,并且8还是第四行的第一个数,因此数字7不可能出现在8所在的行,

《剑指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