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

     

  • 相关阅读:
    VS2008环境下CEGUI 0.7.1及相关工具的编译(转载 + 额外的注意事项)
    Makefile的学习
    Erlang 程序文档(转)
    erlang 二进制数据
    erlang中命令行传参,以及类型等。
    笔记:JAVA的静态变量、静态方法、静态类
    关于手机定位方案设计
    转:eclipse技巧
    DXUT CD3DArcBall类
    关于模型转向自然化思考
  • 原文地址:https://www.cnblogs.com/lightmare/p/10398856.html
Copyright © 2020-2023  润新知