牛客网《剑指Offer》编程 1.二维数组中的查找

题目描述

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

函数原型

bool Find(int target, vector<vector<int> > array)

思路

1.最先想到的思路是自左向右,自上向下遍历array数组,如果在数组下标不越界的情况下能够找到与target相同的数,则return true,否则return false。但是此种方式较慢,时间复杂度为O(m*n)。

2.另一种方式是,从左下角第一个数开始遍历。对左下角第一个数而言,所有右边的数都比它大,所有上边的数都比它小。因此可以有以下算法:i设置为行下标,j设置为列下标。

由左下角第一个数开始遍历array。当i与j分别在行和列的范围内时:

当当前array中的数小于target时,说明应该在比当前的数大的数中寻找是否等于target的数,因此j++;

当当前array中的数大于target时,说明应该在比当前的数小的数中寻找是否等于target的数,因此i++;

如果当前的数等于target,return true。

如果i或j超过了行和列的范围,return false。

实现C++代码如下:

bool Find(int target, vector<vector<int> > array) {
        if (array.empty()) { return false; }
	int row = array.size();
	int col = array[0].size();
	int i=row-1, j=0;
	while (i >= 0 && j < col) {
		if (target < array[i][j]) { i--; }
		else if (target > array[i][j]) { j++; }
		else { return true; }
	}
	return false;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值