解題+總結二維vector的初始化方法
- 題目描述
- 情況1:不確定行數和列數
- 情況2:已知行數和列數
- 情況3:已知行數但不知道列數
- 情況4:已知列數但不知道行數
題目描述
解答:用隊列
思路都差不多,我覺得對于我自己來說,此題最大的難點在于二維vector的初始化。
和之前有行數的初始化不一樣的是:此題不確定行數,也不確定列數。
那我們就以此題為例,總結一下二維vector的初始化吧。
情況1:不確定行數和列數
class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {//用隊列啦(先進先出)//每一層節點都進隊列完,再開始一個一個出隊列//出來的隊頭元素繼續看有沒有左右孩子節點,有的話進隊列,沒有的話那就不管了vector<vector<int>>res;if(!root){return res;}queue<TreeNode*>q;q.push(root);while(!q.empty()){int curLevelsize=q.size();//記錄當前層有的節點個數//vector<int>()創建一個空的vector<int>對象。push_back將這個空的vector<int>添加到res的末尾。每次調用該語句時,都會為新的一層創建一個空的vector<int>,用于存放該層的節點值res.push_back(vector<int>());for(int i=0;i<curLevelsize;i++){TreeNode *node=q.front();q.pop();//res.back()獲取res中最后一個vector<int>(即當前層的存儲容器)。push_back(node->val)將當前節點的值添加到該vector<int>的末尾。res.back().push_back(node->val);if(node->left){q.push(node->left);}if(node->right){q.push(node->right);}}}return res;}
};
定義:vector<vector>res;
初始化新的行并且先插進vector中:res.push_back(vector());
在新的行中一個一個添加數:res.back().push_back(node->val);
vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> res;if (!root) return res;queue<TreeNode*> q;q.push(root);while (!q.empty()) {int curLevelSize = q.size();res.emplace_back(); // 直接在res末尾構造一個空的vector<int>for (int i = 0; i < curLevelSize; i++) {TreeNode* node = q.front();q.pop();res.back().push_back(node->val); // 添加到最后一層的vector中if (node->left) q.push(node->left);if (node->right) q.push(node->right);}}return res;
}
定義:vector<vector> res;
初始化新的行并且先插進vector中:res.emplace_back();
再在新的行中一個一個添加數:res.back().push_back(node->val);
(此法效率比上一個高些)
vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> res;if (!root) return res;queue<TreeNode*> q;q.push(root);while (!q.empty()) {int curLevelSize = q.size();vector<int> level(curLevelSize); // 預留當前層的空間大小for (int i = 0; i < curLevelSize; i++) {TreeNode* node = q.front();q.pop();level[i] = node->val; // 直接賦值if (node->left) q.push(node->left);if (node->right) q.push(node->right);}res.push_back(level); // 將當前層的vector整體添加到res中}return res;
}
定義:vector<vector> res;
先單獨初始化行:vector level(curLevelSize);
再把整行插入vector:res.push_back(level);
(個人感覺此方法最好記)
情況2:已知行數和列數
int rows = 3;
int cols = 4;
vector<vector<int>> res(rows, vector<int>(cols));res[i][j] = value; // 直接為第 i 行第 j 列賦值
情況3:已知行數但不知道列數
int rows = 5;
vector<vector<int>> res(rows);vector<int> temp = {1, 2, 3};
res[i] = temp; // 將第 i 行設置為新行
res[i].push_back(4); // 在第 i 行中添加元素4
情況4:已知列數但不知道行數
int cols = 4;
vector<vector<int>> res;vector<int> row(cols);
res.push_back(row); // 添加一行,每行有cols個默認初始化的元素