C++算法之 二维数组的查找

题目:在一个二维数组当中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组

和一个整数,判断数组当中是否含有该整数。

思路:

1   2   8     9

2   4   9    12

4   7   10  13

6   8   11  15

每一行递增,如果右上角的数字小于要找的数字,那么这一行所有的数字都小于要找的数字;

每一列递增,如果右上角的数字大于要找的数字,那么这一列所有的数字都大于要找的数字;

bool Find(int* sz, int rows, int columns, int key)
{
	bool found = false;

	if (sz == NULL || rows <= 0 || columns <= 0)
	{
		return found;
	}
	if (sz!=NULL && rows> 0 && columns>0)
	{
		int row = 0;
		int column = columns - 1;
		while (row < rows && column > 0)
		{
			if (sz[row*columns + column] == key)
			{
				found = true;
				break;
			}
			else if (sz[row*columns + column] > key) //如果右上角的数字大于要找的数字,那么删除此列
			{
				column--;
			}
			else//如果右上角的数字小于小于要找的数字,删除此行;
			{
				row++;
			}

		}
	}

}

完整测试代码:

// FindNumInSZ.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

bool FindNumOnMatrix(int* matrix, int rows, int columns,int number)
{
	bool found = false;

	if (matrix != NULL && rows > 0 && columns >0)
	{
		int row = 0;
		int column = columns - 1;
		while (row < rows && column > 0)
		{
			if (matrix[row*columns + column]  == number)
			{
				found = true;
				break;
			}
			else if (matrix[row*columns + column] > number)
			{
				--column;
			}
			else
			{
				++row;
			}

		}

		return found;
	}
}
bool Find(int* sz, int rows, int columns, int key)
{
	bool found = false;

	if (sz == NULL || rows <= 0 || columns <= 0)
	{
		return found;
	}
	if (sz!=NULL && rows> 0 && columns>0)
	{
		int row = 0;
		int column = columns - 1;
		while (row < rows && column > 0)
		{
			if (sz[row*columns + column] == key)
			{
				found = true;
				break;
			}
			else if (sz[row*columns + column] > key) //如果右上角的数字大于要找的数字,那么删除此列
			{
				column--;
			}
			else//如果右上角的数字小于小于要找的数字,删除此行;
			{
				row++;
			}

		}
	}

}
int _tmain(int argc, _TCHAR* argv[])
{
	int sz[] = {1,2,8,9,
				2,4,9,12,
				4,7,10,13,
				6,8,11,15
				};
	bool b = FindNumOnMatrix(sz,4,4,2);

	cout<<b<<endl;

	bool c = Find(sz,4,4,2);
	cout<<c<<endl;

	getchar();

	return 0;
}

二维数组可以尝试左上角,右上角,左下角,右下角等特殊的地方开始进行思考!

时间: 2024-10-09 18:09:25

C++算法之 二维数组的查找的相关文章

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

《剑指Offer》算法题——二维数组查找

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. class Solution { public: bool Find(vector<vector<int> > array, int target) { int col = array.size(); int i = 0; while (i < col) { int j = array[i].size()

二维数组的查找

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

特殊二维数组的查找

题目:在一个二维数组的中,每一行都按照从左到右的递增顺序排列,每一列都按照从上到下的递增序列排序,请设计一个函数,输入这样的一个二维数组和一个整数,查询在此二维数组中是否存在此整数. example:在下列数组中 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 查询是否有7存在,存在返回true,否则返回false(显然应该返回true) 查询是否有5存在,存在返回true,否则返回false(显然应该返回false) 这么简单?耿直的我立马就想到了暴力算法,一个一个比

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

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

在一个每一行从左到右递增每一列从上到下递增的二维数组中查找一个整数是否存在——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 &