zoukankan      html  css  js  c++  java
  • 面试题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;
        }
    }

     

  • 相关阅读:
    leetcode701. Insert into a Binary Search Tree
    leetcode 958. Check Completeness of a Binary Tree 判断是否是完全二叉树 、222. Count Complete Tree Nodes
    leetcode 110. Balanced Binary Tree
    leetcode 104. Maximum Depth of Binary Tree 111. Minimum Depth of Binary Tree
    二叉树
    leetcode 124. Binary Tree Maximum Path Sum 、543. Diameter of Binary Tree(直径)
    5. Longest Palindromic Substring
    128. Longest Consecutive Sequence
    Mac OS下Android Studio的Java not found问题,androidfound
    安卓 AsyncHttpClient
  • 原文地址:https://www.cnblogs.com/lightmare/p/10398856.html
Copyright © 2011-2022 走看看