(C++)剑指offer-1:二维数组中的查找

剑指offer-1:二维数组中的查找

目录

1题目描述

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。

请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

这里写图片描述

2问题解析

下面二维数组中,每行、每列都是递增排序。
如果查找到数字7则返回true,如果未查找到则返回false。

1  2  8   9
2  4  9   12
4  7  10  13
6  8  11  15
  • 数据结构:数组(查找数字)
  • 寻找直观简单的规律

该题对于初始判断元素的选取有很大关系。
(1)如果从数组中间选取,需要判断两次(左上小、右下大),规律难找
(2)从左上、右下选取,也难以寻找规律
(3)从左下(右上),都有规律寻找


以从左下寻找为例:
数组(矩阵)是有序的,从左下角来看,向上数字递减,向右数字递增。
当要查找的数字小于左下角数字时,上移。
当大于左下角数字时,右移。

3用到的语法

break & continue

  • break 结束整个循环
  • continue 结束本次循环,进入下一循环

vector
在c++中,vector是一个十分有用的容器。

作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

vector在C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。


特别注意,使用vector需要注意以下几点:

1、如果你要表示的向量长度较长(需要为向量内部保存很多数),容易导致内存泄漏,而且效率会很低;
2、Vector作为函数的参数或者返回值时,需要注意它的写法:
double Distance(vector< int >&a, vector< int >&b) 其中的“&”绝对不能少!!!


实例:vector< in t>test;

//建立一个vector,int为数组元素的数据类型,test为动态数组名
简单的使用方法如下:
vector< int>test; //建立一个vector
test.push_back(1);
test.push_back(2); //把1和2压入vector,这样test[0]就是1,test[1]就是2


二维数组

vector< vector< Point2f > > points; //定义一个二维数组
points[0].size(); //指第一行的列数


基本操作

(1)头文件#include< vector>.
(2)创建vector对象,vector< int> vec;

(3)尾部插入数字:vec.push_back(a);
(4)使用下标访问元素,cout<< vec[0] << endl;记住下标是从0开始的。

(5)使用迭代器访问元素.
vector< int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<< *it << endl;

(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
(7)删除元素: vec.erase(vec.begin()+2);删除第3个元素

(8)向量大小:vec.size();
(9)清空:vec.clear();

特别提示:这里有begin()与end()函数、front()与back()的差别

4结果和完整程序

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
            int rows    = array.size();
            int columns = array[0].size();
            int i,j;
            for(i=rows-1,j=0; i>=0&&j<columns; )
            {
                if(array[i][j] == target)
                {
                    cout<<"find!"<<endl;
                    return true;
                }
                if(array[i][j] > target)
                {
                    i--;
                    continue;
                }
                if(array[i][j] < target)
                {
                    j++;
                    continue;
                }
            }
            cout<<"not find"<<endl;
            return false;  
    }
};

完整程序

#include <iostream>
#include <vector>
using namespace std;

class Solution
{
    public:
        bool Find(int target, vector<vector<int> > array)
        {
            int rows    = array.size();
            int columns = array[0].size();
            int i,j;
            for(i=rows-1,j=0; i>=0&&j<columns; )
            {
                if(array[i][j] == target)
                {
                    cout<<"find!"<<endl;
                    return true;
                }
                if(array[i][j] > target)
                {
                    i--;
                    continue;
                }
                if(array[i][j] < target)
                {
                    j++;
                    continue;
                }
            }
            cout<<"not find"<<endl;
            return false;
        }

};

int main()
{
    Solution answer;

    int array_temp[4][4]={1,2,8,9,
                          2,4,9,12,
                          4,7,10,13,
                          6,8,11,15
                          };

    int target = 7;

    int i,j;

    vector<vector<int> > array(4);
    for(i=0;i<array.size();i++)
    {
        array[i].resize(4);
    }

    for(i = 0; i < array.size(); i++)
    {
        for (j = 0; j < array[0].size();j++)
        {
            array[i][j] = array_temp[i][j];
        }
    }


    cout<<answer.Find(7,array)<<endl;

}

运行结果:
find!
1

5关于动态数组赋值(vector)

第一种:

#include <iostream>
#include <vector>
using namespace std;

int main()
{

    int array_temp[4][4]={1,2,8,9,
                          2,4,9,12,
                          4,7,10,13,
                          6,8,11,15
                          };
    int i,j;

    //得到一个 4行4列的数组,通过resize()的形式改变行列数
    vector<vector<int> > array(4);
    for(i=0;i<array.size();i++)
    {
        array[i].resize(4);
    }

    for(i = 0; i < array.size(); i++)
    {
        for (j = 0; j < array[0].size();j++)
        {
            array[i][j] = array_temp[i][j];
        }
    }

    cout<<array[2][3]<<endl;
}

13

第二种:
push_back

#include <iostream>
#include <vector>
using namespace std;

int main()
{

    int array_temp[4][4]={1,2,8,9,
                          2,4,9,12,
                          };
    int i,j;

    vector<vector<int> > array;
    vector<int> a;
    vector<int> b;

    for(i=0;i<4;i++)
        a.push_back(array_temp[0][i]);
    for(i=0;i<4;i++)
        b.push_back(array_temp[1][i]);

    cout<<"a[1]="<<a[1]<<endl;
    cout<<"b[2]="<<b[2]<<endl;

    array.push_back(a);
    array.push_back(b);
    cout<<array.size()<<endl;
    cout<<array[0].size()<<endl;

    cout<<array[1][2]<<endl;

}

运行结果:
a[1]=2
b[2]=9
2
4
9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值