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

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

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

解法:当然我们知道通过遍历完数组是可以找到的,但这不是我们的目的。因为每一行每一列都是递增顺序的,我们可以按照对角线的方向思考。
先思考一下正对角线,如果我们取正对角线上的一个数字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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值