剑指Offer面试题目第3题-二维数组中的查找

进来准备找工作了,再看剑指offer,刚刚看了不多,就发现一个很有意义的事情,提醒自己要多动手,少瞎想。来给大家分享一下,作为自己的第一篇博客。

题目原内容:

在一个二维数组中,每一行从左至右递增排列,每一列从上之下递增排列,完成一个函数,输入这样一个数组和一个目标的数字,判断输入的数字是否在目标数组中。

解题的思路不给出了,在网上很好找到。直接贴代码来将自己的目的。

/*
参数:
	int target 目标数字
	int array[][5] 目标数组 我的目标数组实验用的列大小为5
	int width 数组列数
	int heigth 数组行数
返回值
	int
	1-->代表找到
	0-->代表不存在

*/
int find(int target,int array[][5],int width,int heigth){
	//int target_x = 0; 
	//int target_y = -1;

	int y = width-1; //存储目标的位置Y
	int x = 0; //存储目标位置X
	//从右上角开始查找,至左下角目标方向
	//横向列循环,依次循环从右至左移动一次
	while(y>=0){ 
		 //找到目标数字,返回整形数字1
		if(array[x][y] == target){
			//printf("target X:%d,target Y:%d",x,y); 打印目标地址
			return 1;
		}
		if(array[x][y] < target){ 
			//竖向行循环,依次循环从上到下移动一次
			while(x<width){
				if(array[x][y] == target){
					//printf("target X:%d,target Y:%d",x,y); 打印目标地址
 					return 1;
				}else if(array[x][y] > target){
					//行循环中止,继续列循环
					break;
				}else{
					//printf("===row:%d\n",x); 打印行循环查找路径
					x++;
				}
			}
		}
		//printf("===coloum:%d\n",y); 打印列循环查找路径
		y--;
	}
	return 0;

}

接下来给一个书上的目标代码,人家写的很不错。简洁高效。严格来说并不完全一样,但是算法思路都是一样的。注释就不加了,这不是本次的重点。

int find(int target,int array[][5],int width,int heigth){
	if(width>0&&heigth>0){
		int row = 0;
		int colume = heigth - 1;
		while(row <width&&colume >= 0){
			if(array[row][colume] == target){
				return 1;
				break;

			}else if(array[row][colume]>target){
				--colume;
			}else{
				++row;
			}
		}
	}
	return 0;
}


接下来是重点,本来看到这道题的时候,自己纸上草写一下代码,在VC里面跑的时候发现错误,原来自己考虑太简单,仅仅想到一个弯。仔细看题,发现作者给的例子有一点点误导性,但是人家书本讲解需要吧。不过人家的代码给的很好。

第一次博客,用来激励自己多联系,多用这种公开的方式监督自己好好学习。最后把自己第一次错误的代码拿出来“纪念一下”

// 错误代码 简单给一下,中间省去一下代码。主要表达错误思想
int find3(int target,int array[][5],int width,int heigth){
	int target_y = 0;
	for(int i=width-1;i>=0;i--){
		// 相等输出
		if(target == array[0][i]){
			printf("target X:0,target Y:%d",i);
			return 1;
		}
		// 大于说明在这一行以下,向这一行以下寻找
		if(target > array[target_x][i]){
			target_y = i+1;
		
		}
	}
	for(int j=0;j<heigth;j++){
		if(target == array[j][target_y]){
			return 1;
		}
	}
	return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值