面试题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;
    }
}

 

 

 

 

posted @ 2018-07-08 17:12  lightmare  阅读(136)  评论(0编辑  收藏  举报