最近在刷《剑指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;
}
测试结果: