剑指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