《剑指offer》第一题

最近在刷《剑指offer》的66道编程题,准备先用c++刷一遍,后期再用python重刷一遍,在刷题的过程中不仅把函数实现了,还写了测试的代码确保结果的正确性。废话不多说,直接上题。

题目:二维数组查找

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

思路:

首先应判断该整数是否在二维数组的最小值和最大值的范围内(最小值为左上角元素值,最大值为右下角元素值),如果不在则可以判断数组中不含该整数,否则再进行查找。取数组中的右上角的元素值m与改整数比较,若该整数与m相等,则查找结束;若该整数大于m,则可排除m所在的行;若该整数小于m,则可排除m所在的列。

c++实现:

#include "stdafx.h"
#include"stdio.h"
#include<iostream>
#include<vector>

using namespace std;

class Solution{
public:
	bool Find(int target,vector<vector<int>> array){
		//获取数组的行列数
		int row=array.size();
		int col=array[0].size();
		//初始化(i.j)为右上角位置
		int i=0;
		int j=col-1;
		//判断是否在最大最小值之间
		if(target>=array[0][0]&&target<=array[row-1][col-1]){
			//从右上角开始判断
			while(i>=0&&i<=row-1&&j>=0&&j<=col-1){
				//如果相等则结束查找
				if(target==array[i][j])
					return true;
				//如果目标比右上角的值小,则排除这一列
				else if(target<array[i][j])
					j--;
				//如果目标比右上角的值大,则排除这一行
				else
					i++;
			}
			return false;
		}
		else
			return false;

	}
};


int _tmain(int argc, _TCHAR* argv[])
{
	int a[4][4]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
	vector<vector<int>> array(4,vector<int>(4,0));

	cout<<"给定的二维数组:"<<endl;
	for(int i=0;i<4;i++){
		for(int j=0;j<4;j++){
			array[i][j]=a[i][j];
			cout<<array[i][j]<<" ";
		}
		cout<<endl;
	}
	cout<<endl;

	//测试
	Solution solution;
	int target;
	bool result;
	//用户输入要判断的数
	cout<<"请输入要判断的数:";
	cin>>target;
	result=solution.Find(target,array);
	if(result==1)
		cout<<"存在"<<endl;
	cout<<endl;
	if(result==0)
		cout<<"不存在"<<endl;
	cout<<endl;

	return 0;
}


测试结果:
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值