在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序

【剑指offer】1.在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。

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

客户需求分析:
递增的二维数组中可能存在相同的元素,例如[ 1,2,3;2,3,4;3,4,5],客户只要求判断数组中是否存在target,重复元素并没有影响。
查找资料分析,大体有三种思路:
1.直接查找:每一个array[i][j]与target进行比较,时间复杂度为o(m*n);
2.先按行再按列查找:array[i][col-1]与target进行比较确定行,再按列进行查找,时间复杂度o(m+n);
参考博客:https://blog.csdn.net/alidada_blog/article/details/82494856
3.按行再按列结合二分查找:按行确定行值,二分查找确定列值,时间复杂度o(m+lgn);
按照第三种方案进行设计
思路:

   我们可以根据二维数组的特性,在查找数组里是否有这个整数时,我们可以先按行再按列并采用二分查找。

在这里插入图片描述
我们可以看到以上二维数组的存储则:

行数:int row = (int)array.size();

列数:int col = (int)array[0].size();

1.有了行数和列数,我们就得在数组中确定target所在的行,在这里我选取的是右上角的数去和target比较
如果array[ i][ col-1] > target;便确定了target所在的行
按照二分查找,如果array[i][j]==target;便确定了target所在的列;
注意细节:
target不在数组范围内以及数组为空的时候,直接返回false
c++计算机编程实现:

class Solution {
public:
int Binary_Search(vector<vector<int> > array, int n, int m, int key)
{
	int low, high, mid;
	low = 1;     /*定义最底下标为记录首位*/
	high = n;    /*定义最高下标为记录末位*/
	while (low <= high)
	{
		mid = (low + high) / 2;    /*折半*/
		if (key < array[m][mid])
			high = mid - 1;
		else if (key > array[m][mid])
			low = mid + 1;
		else
			return mid;
	}
	return (0);
}

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

			if (Binary_Search(array, col, i, target))
				return true;
			else
                j--;
		}
		else if (array[i][j] < target)
		{
			i++;
		}

		else
		{
			return 1;//牛客网编译器的原因,要停止程序
		}
	}

	return 0;//牛客网编译器的原因,要停止程序

}

};

在这里插入图片描述
实验结果分析
本次实验结果比看过的博客的实验结果更加优质,在时间上快了6ms,提升了40%的效率
总结:
本次实验遇到了拼写单词错误、if逻辑错误、对于题目意思没有理解到位的情况,还有test过程中模块位置放置的顺序错误,无法识别模块的问题。导致测试结果不让人满意。
解决方案:
做完程序检查一遍单词,对于逻辑错误采用调试过程中的逐语句的方式检查问题出在哪里。
对于题目意思没有理解到位的情况,可以参考做对的人代码原理,并且自己调试结果。
实验用时:6小时

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值