面试题 ——— 二维数组的查找

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGwwOTE0NzkxMDEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

解法, 能够从右上角或左下角的数開始。 与要寻找的数进行比較。 以左下角为例,假设要查找的数是9,   6小于9, 所以6所在的列都小于9, 删掉该列。 8 小于 9, 同理删掉该列。  11 大于9, 它右边的数肯定大于9, 删掉该行。 同理, 删掉 10 所在的行, 最后 9 等于 9 。找到, 返回true。

code:

bool Find(int* arr, int rownum, int colnum, int num)
{
	if (arr == NULL || rownum < 0 || colnum<0)
	{
		return false;
	}

	int row = rownum - 1;
	int col = 0;

	while (row >= 0 && col <= colnum)
	{
		if (arr[row*colnum + col] < num)
		{
			col++;
		}
		else if(arr[row*colnum + col] > num)
		{
			row--;
		}
		else
		{
			return true;
		}
	}
		return false;
}
时间: 2024-12-14 12:22:21

面试题 ——— 二维数组的查找的相关文章

ACM_二维数组的查找

二维数组的查找 Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定一个n*m的二维数组,保证a[i][j] < a[i+1][j],a[i][j]< a[i][j+1](其中0≤i< n-1,0≤j< m-1); 接下来有q个询问,每个询问包含一个数字num,查找num是否包含在该二维数组里面. Input: 输入包含多组测试数据,对于每组数据,首先输入两个整数n,m,(1≤n,m≤1000).接下来输入n*m

剑指offer:二维数组的查找

题目:二维数组的查找 思路: 由于二维数组是从左到右,从上到下是递增的,所以可以从右上角或者左下角开始选择, 比如从右上角开始, 右上角的值都比目标值大的话,而右上角所在列的值都比右上角的值大,则所在列排除. 右上角的值都比目标值小的话,而右上角所在行的值都比右上角的值小,则所在行排除. 以此类推,查找会以行或者列的范围进行缩小.直到得到与目标值相同的值或者没有相同值. 图解: 而右上角所在列的值都比目标值大,则排除所在列. 有 图解: 代码: class Solution { public b

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

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

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

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

剑指offer刷题—二维数组的查找

最近接触到一本书叫做剑指offer,在这里准备在这个2个月左右将这本书刷完,当然,不需要每天多少道什么的,不在多,一天理解一道就好了,希望能成为一种习惯,另外,准备在github上也进行同步分享. 今天第一道题: 面试题3:二位数组中的查找 当我们需要解决一个复杂问题时,一个很有效的方法就是从具体的问题出手,通过分析具体的例子,得到规律. 再一个二维数组中,每一行都要按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排列.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含

在一个每一行从左到右递增每一列从上到下递增的二维数组中查找一个整数是否存在——3

给定一个二维数组,数组的特点是:每一行从左到右数据大小依次递增,每一列数据从上到下依次递增,要求判断一个整数是否在这个二维数组中: 设计二维数组如下: 首先,毋庸置疑的的是,遍历一遍数组肯定能判断出来,这也是最笨的方法了,因此,要想提高程序的运行效率就得找出一种高效的方法来查找: 一开始的想法大概都能想到从数组第一行第一列的数开始沿着对角线判断,如果是对角线数据就可以直接返回,比如我们要想查找17这个数,这时候17比0.9.16都要大,因此以0.9.16为对角线的矩形数据就可以排除了,接下来判断

每日一题10:在排序的二维数组中查找

排序的二维数组是这样的:在每一行中元素是递增的,在每一列中元素也是递增的,比如: 11 34 35 47 51 13 37 40 52 61 19 42 50 79 80 给定一个值,判断其是否在这样排序的二维数组中. 首先,先来生成测试数据,思路如下:1)先选择一种将给定输入按升序排列.2)构造一个二维数组,寻找该数组中以第一个元素为起点,确定一个最大的正方形区域(其宽要么与原数组的行或与原数组的列数相同).3)按规则,在这个正方形中,每个对角线元素都不小于从数组起点到这个元素所构成的正方形区

【C/C++学院】(3)二维数组/二分查找法/指针/模块注射

1.二维数组 二维数组可以当做一个一维数组, 每一个元素又是一个一维数组. #include <stdio.h> #include <stdlib.h> void main() { int a[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { printf("%d,%d,%d,%x,%x &

二维数组的查找

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 例如:下面的二维数组就是每行.每列都递增排序.如果在这个数组中查找数字7,则返回true:如果查找数字5,则由于数组不含该数字,返回false. 假如现在要判断在这个二维矩阵中是否包含数字7,则查找步骤如下所示:     (a) 9>7,下次在9的左侧查找:  (b) 8>7,下次在8的左侧查找:     (c) 2<