二维数组中的查找

試著忘記壹切 提交于 2020-03-06 02:07:57

面试题四 二维数组中的查找

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

解法:当然我们知道通过遍历完数组是可以找到的,但这不是我们的目的。因为每一行每一列都是递增顺序的,我们可以按照对角线的方向思考。
先思考一下正对角线,如果我们取正对角线上的一个数字n,如果n比要找的数m大,那么m就落在n的位置左边或者上边,由于这两片区域有重叠区域,接下来不好找,所以我们从反对角线来思考一下问题,可能要会简单点。
从右上角,取反对角线上的第一个数n,如果要找的数m比n大,那么m在n的位置下面;如果m比n小,那么m就在n的左边。按照这个方法,慢慢地排除一行一列,从而找到那个数,或者没有这个数。算法的时间复杂度为O(n),空间复杂度为O(1)
代码:

#include<stdio.h>
#include<iostream>

using namespace std;

//在二维排序数组中找到某个数
bool findNumber(int arr[][4],int rows,int cols,int num);

int main() {

	int arr[4][4] = { { 1,2,8,9},
					 { 2,4,9,12},
					 {4,7,10,13},
					 {6,8,11,15} };

	int num = 5;
	bool isFind = findNumber(arr, 4, 4, num);
	cout << "result isFind:" << isFind<<endl;

	return 0;
}

bool findNumber(int arr[][4], int rows, int cols,int num) {

	if (arr == nullptr || rows <= 0 || cols <= 0) {
		return false;
	}

	bool isFind = false;
	int i = 0, j = cols - 1;
	while (i < rows&&j >= 0) {

		if (arr[i][j] == num) {
			isFind = true;
			break;
		}
		else if (arr[i][j] > num) {
			j--;
		}
		else {
			i++;
		}
	}
	return isFind;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!