前两天的项目刚好涉及到了STL的vector容器类,虽然当时看了基础知识,但是现在转到二维上就不会了,所以刷题遇到就要好好整理一下。
vector就是动态数组,二维也相当于特殊的一维,只是每一个元素都是一个数组。
二维Vector的更直观理解~~~~
https://blog.csdn.net/yuanjilai/article/details/7321484
二维vector 定义
//=================== 头文件 =======================
#include <vector>
//=================== 创建二维vector ==============
// 创建一个 5*3 的二维数组
int i,j;
vector < vector < int > > array(5); // 行
for (i = 0; i < array.size(); i++)
array[i].resize(3); //列
cout << "Row:" << a.size() << " Column:" << a[0].size() << endl;//显示行列数
给数组赋值
(1)通过vector的push_back函数
vector<vector<int>> vec;
vector<int> a; //先单独定义一维vector
a.push_back(1);
a.push_back(2);
vector<int> b;
b.push_back(4);
b.push_back(5);
vec.push_back(a); //再将一维和二维压进二维VECTOR
vec.push_back(b);
(2)通过下标遍历赋值
//第一部分初始化的二维数组
for(i = 0; i < array.size(); i++)
{
for (j = 0; j < array[0].size();j++)
{
array[i][j] = i+j;
}
}
遍历数组元素
(1)利用下标
//其实就是下标遍历赋值
cout << "[" << endl;
for (i = 0; i < a.size(); i++) //遍历行
{
cout << "[" << " ";
for (j = 0; j < a[0].size(); j++)//遍历列
{
a[i][j] = i + j;
cout << a[i][j] << " ";
}
cout << "]" << endl;
}
cout << "]" << endl;
(2)通过vector内部迭代器遍历
vector<int>::iterator it; //一维数组迭代器
vector<vector<int>> ::iterator iter; //二维数组迭代器
vector<int> a_tmp; //建立一个临时一维vector
for (iter = a.begin(); iter != a.end(); iter++)
{
a_tmp = *iter; // ******important*******
for (it = a_tmp.begin(); it != a_tmp.end(); it++)
cout << *it << " "; // 输出的迭代器 *it
cout << endl;
}
查找数组内指定元素
结合题目,题目给出的数组是:
每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
常规思路
(我开始只能想到这一种方法_)
在for循环里,利用下标或者迭代器从第一个元素开始比较,直到遍历所有的元素。
class Solution
{
public:
bool Find(int target, vector<vector<int> > array)
{
if (array.empty())
return false;
bool flag = false;
int i, j;
for (i = 0; i < array.size(); i++)
{
for (j = 0; j < array[0].size(); j++)
{
if (array[i][j] == target)
flag = true;
}
}
return flag;
}
};
结合题目从左下角开始比较
因为这个二维数组是有序的,就如我上面建的数组一样,以左下角为起点,
如果 target > 左下角 ,那么肯定是在右边的元素中,把坐标右移;
如果 target < 左下角 ,那么肯定是在上边的元素中,把坐标上移;
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int rows = array.size();
int cols = array[0].size();
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;
}
};