题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
如图:
只能从左下角或者从右上角入手,输入的数大于当前数就往右走,小于当前的数就往上走
C++核心代码:
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int row = (int)array.size();//获取行的长度
int col = (int)array[0].size();//获取列的长度
int num=0;//这里是从左下角下手的,初始化为第一个
if (row == 0 || col == 0)
return false;
if (target < array[0][0] || target > array[row - 1][col - 1])
return false;
for(int i=row-1;i>=0&&num<col;)//num<colCount是为了防止数组越界
{
if(array[i][num]==target)
{
return true;
}
if(target>array[i][num])//如果输入的数大于当前数就往右走num++ 进入下一个循环
{
num++;
continue;
}
if(target<array[i][num])//如果输入的数小于当前数就往上走num不变,进入下一个循环
{
i--;
continue;
}
return false;
}
return false;
}
};
C++完整代码:
#include<stdio.h>
#include <iostream>
#include<stdlib.h>
#include<vector>
#include<string>
#include <algorithm>
using namespace std;
bool Find(int target, vector<vector<int> > array) {
int row = (int)array.size();//获取行的长度
int col = (int)array[0].size();//获取列的长度
int num = 0;
if (row == 0 || col == 0)
return false;
if (target < array[0][0] || target > array[row - 1][col - 1])
return false;
for (int i = row - 1; i >= 0 && num<col;)//num<colCount是为了防止数组越界
{
if (array[i][num] == target)
{
return true;
}
if (target>array[i][num])
{
num++;
continue;
}
if (target<array[i][num])
{
i--;
continue;
}
return false;
}
return false;
}
int main()
{
bool b;
int r = 0, c = 0;
cout << "Enter r: ";//规定二维数组行数
cin >> r;
cout << "Enter c: ";//规定二维数组列数
cin >> c;
vector<vector<int>> array;//定义二维数组
vector<int>v;//定义一维数组
array.clear();//将二维数组清空,或初始化(初始化代码很简单,不会可以百度)//也可不用这一步
int temp = 0;
for (int i = 0; i < r; i++)//输入r*c的二维数组
{
v.clear();//子数组返回时要清除
for (int j = 0; j < c; j++)
{
cin >> temp;
v.push_back(temp);
}
array.push_back(v);
}
for (int i = 0; i < r; i++)//打印输入的二维数组
{
for (int j = 0; j < c; j++)
{
cout << array[i][j] << " ";
}
printf("\n");
}
if (Find(5, array)) {
cout << "true" << endl;
}
else {
cout << "false" << endl;
}
system("pause");
return 0;
}