解题思路:
1、判断数组original的长度是否为m*n,不是,则返回空数组;相等,则进行下一步。
2、想法:
- 生成m*n的二维数组,双重循环遍历original,一个一个填入
- 1的优化吧,二维数组第一行为0~n-1,第二行为n~2n-1,直接把这一段数组赋值给二维数组的每一行
本以为自己的想法太简单,结果好像真就是这样,是简单题没跑了。。
想法一的代码就没弄了,想法2的话就是会多一些函数的调用代码如下
public:
vector<vector<int>> construct2DArray(vector<int>& original, int m, int n) {
int length = original.size();
if (length != m*n) {
return {};
}
vector<vector<int>> result;
result.reserve(m);
for (auto i = original.begin(); i != original.end(); i+=n) {
result.emplace_back(i, i+n);
}
return result;
}
};
总结几个上面代码一开始自己写的时候范的错译(ps:部分是因为好久没碰,忘记了)
- vector.reserve()可以很好的缩减空间,减少空间复杂度
- emplace_back函数里放的是指针,不是vector数组的下标,所以for循环里要用begin,end函数
- original.begin()前面的类型可以是auto或vector<int>::iterator,int*是不对的。
-
对于上面一个的解释:迭代器是广义上的指针,事实上,它可以是指针,也可以是一个对其执行类似指针的操作。通过将指针广义化为迭代器,让STL能够为各种不同的容器类(包括哪些简单指针无法处理的类)提供统一的接口。每个容器类都定义了一个合适的迭代器,该迭代器的类型是一个名为iterator的typedef,其作用域为整个类。(ps:网上找的)