面试题4:二维数组的查找
1.题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
输入描述:
array: 待查找的二维数组
target:查找的数字
输出描述:
查找到返回true,查找不到返回false
c++版本
#include <cstdio>
#ifndef nullptr
#define nullptr 0
#endif
bool Find(int* matrix, int rows, int columns, int number)
{
bool found = false;
if(matrix != nullptr && rows > 0 && columns > 0)
{
int row = 0;
int column = columns - 1;
while(row < rows && column >=0)
{
if(matrix[row * columns + column] == number)//指针描述
{
found = true;
break;
}
else if(matrix[row * columns + column] > number)
-- column;
else
++ row;
}
}
return found;
}
bool find2(int* matrix,int rows,int columns,int number)//以左下角为基准
{
bool found=false;
if (matrix!=nullptr && rows>0&&columns>0)//说明查找范围存在
{
int row=rows-1;
int column=0;
while (row>=0&&column<=columns)//缩小查找范围
{
if(matrix[row*columns+column]==number)
{
found=true;
break;
}
else if (matrix[row*columns+column]<number)
column++;
else
row--;
}
}
return found;
}
/*在线编程*/
bool Find3(int target, vector<vector<int> > array) {
bool found=false;
int rows=array.size();
int columns=array[0].size();
if(!array.empty()&&rows>0&&columns>0){
int row=0;
int column=columns-1;
while(row<rows&&column>=0)
{
int temp=array[row][column];
if(temp==target)
{
found=true;
break;
}
else if(temp<target)
row++;
else
column--;
}
}
return found;
}
// ====================测试代码====================
void Test()
{
int intarray[4][4]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
//得到一个4行4列的数组
//由vector实现的二维数组,可以通过resize()的形式改变行、列值
int i,j;
vector<vector<int>> vecarray(4);
for (i = 0; i<vecarray.size(); i++)
vecarray[i].resize(4);
for(i = 0; i < vecarray.size(); i++)
{
for (j = 0; j < vecarray[0].size();j++)
{
vecarray[i][j] = intarray[i][j];
}
}
printf("%d",Find3(1,vecarray));
}
运行时间:12ms
占用内存:1372k
python版本
# -*- coding:utf-8 -*-
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
rows = len(array) - 1
cols= len(array[0]) - 1
i = rows
j = 0
while j<=cols and i>=0:
if target<array[i][j]:
i -= 1
elif target>array[i][j]:
j += 1
else:
return True
return False
运行时间:425ms
占用内存:5624k
Java版本
public class Solution {
public boolean Find(int target, int [][] array) {
int rows = array.length;
int cols = array[0].length;
int i=rows-1,j=0;
while(i>=0 && j<cols){
if(target<array[i][j])
i--;
else if(target>array[i][j])
j++;
else
return true;
}
return false;
}
}
运行时间:191ms
占用内存:17580k
2.用vector容器代替数组 ——使用数组初始化vector对象
在C++中,我们不能用数组直接初始化另一数组,而只能创建新的数组,然后显式的把原数组的元素逐个复制给新的数组。
按照C语言中的做法:
const size_t arry_size=6;
int int_arry[arry_size]={0,1,2,3,4,5};
int int_arry2[arry_size];
for(size_t ix=0;ix<arry_size;++i)
int_arry2[ix]=int_arry[i];
而使用数组初始化vector对象,可以直接利用一个vector对象来初始化另一个vector对象:
#include<iostream>
#include<vector>
using namespace std;
int main(){
//使用数组初始化vector对象
const size_t arr_size=6;
int int_arr[arr_size]={0,1,2,3,4,5};
vector<int> ivec(int_arr,int_arr+arr_size);
/*传递给ivec的两个指针标出了vector初值的范围。第二个指针指向被复制的最后一个元素之后的地址空间,所以是size不是size-1。*/
//被标出的元素范围可以是数组的子集
vector<int> ivec1(ivec);
for(vector<int>::size_type i=0;i!=ivec1.size();++i)
cout<<ivec1[i];
cout<<endl;
return 0;
}
讲数组转换为vector对象后,可以使用vector对象的各种函数操作,如size()获取元素个数,push_back()在末未添加新的元素等。
3.c++ vector 实现二维数组
简介
在STL中Vector这一容器,无论是在封装程度还是内存管理等方面都由于传统C++中的数组。本文主要是关于使用Vector初始化、遍历方面的内容。其他二维的思想也是类似的。
这里简单叙述一下C++ 构建二维动态数组
int **p;
p = new int*[10]; //注意,int*[10]表示一个有10个元素的指针数组
for (int i = 0; i < 10; ++i)
{
p[i] = new int[5];
}
1.初始化
(1)利用Vector的push_back函数
vector<vector<int>> vec;
vector<int> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
vector<int> b;
b.push_back(4);
b.push_back(5);
b.push_back(6);
vec.push_back(a);
vec.push_back(b);
(2)先定义好二维数组结构,在直接赋值
//得到一个5行3列的数组
//由vector实现的二维数组,可以通过resize()的形式改变行、列值
int i,j;
vector<vector<int>> array(5);
for (i = 0; i < array.size(); i++)
array[i].resize(3);
for(i = 0; i < array.size(); i++)
{
for (j = 0; j < array[0].size();j++)
{
array[i][j] = (i+1)*(j+1);
}
}
2.遍历
(1)利用迭代器
void reverse_with_iterator(vector<vector<int>> vec)
{
if (vec.empty())
{
cout << "The vector is empty!" << endl;
return;
}
vector<int>::iterator it;
vector<vector<int>>::iterator iter;
vector<int> vec_tmp;
cout << "Use iterator : " << endl;
for(iter = vec.begin(); iter != vec.end(); iter++)
{
vec_tmp = *iter;
for(it = vec_tmp.begin(); it != vec_tmp.end(); it++)
cout << *it << " ";
cout << endl;
}
}
(2)得到行、列大小,利用下标进行遍历
void reverse_with_index(vector<vector<int>> vec)
{
if (vec.empty())
{
cout << "The vector is empty!" << endl;
return;
}
int i,j;
cout << "Use index : " << endl;
for (i = 0; i < vec.size(); i++)
{
for(j = 0; j < vec[0].size(); j++)
cout << vec[i][j] << " ";
cout << endl;
}
}