contents
introduction
- 有的题,官方的解答已经很详细,就不赘述;
- 有的题,记录网上相关资料链接,就不班门弄斧;
- 有的题,自己补充, 解释;
- 有的题,抛砖引玉,奉上自己的代码,有c, c++, python; java很久没用就不献丑了.
不想分N篇文章发凑积分, 合在一处方便查看,应该是篇长文.
-
在解题过程中涉及相关知识点的会作深入扩展学习,学有余力的朋友千万不要错过~我会给出索引,但是由于文章边写边改,最好使用页面查找功能—ctrl+F or F3
-
涉及的相关知识点,欢迎朋友们指正或补充,乃至提供深入分析,用这份资料以点带面串连起整个IT知识体系,在刷Leetcode的同时将理论联系实际,理论指导实际,共同进步,造福大家~
Top 100 liked list
Top 100 interviewed list
The simple with solution
Leetcode: easy, todo.难度为"简单"且有答案的题目.
994
伪伪代码 :
- 用struct cell 存储一个单元格信息,包括{行,列,深度}, 这里采用BFS,深度就是消耗的时间;
- 用队列rotted_cells存储具有传染性的腐败橘子: 遍历grid,将所有腐烂的橘子入队;
- 从队头依次处理腐败橘子,它的上下左右如果是新鲜的就是可以传染的: 处理过的cell 弹出, 下一个,直到队列为空.
- 再次遍历grid, 如果此时还有新鲜的,说明它是个不会被传染的孤岛,会一直新鲜下去, return -1;
- return depth. 这里的depth就是全烂了需要的时间.
class Solution {
public:
// 这里struct没有显式的构造函数,所以后面不能用emplace()代替push
// 可以用类代替结构体,就可以使用emplace(),不过这里相对简单,用struct就行了吧.
struct cell {
int row;
int col;
int depth;
};
int orangesRotting(vector<vector<int>>& grid) {
queue<cell> rotted_cells;
int cols = grid[0].size(), rows = grid.size();
for (int i= 0; i< rows; i++)
for (int j=0;j<cols; j++) {
//这里不能用emplace(),因为struct cell没有默认构造函数
// 先构造对象,后push 也许更加明智。待定~
if (2 == grid[i][j]) rotted_cells.push({i,j,0});
}
int depth = 0;
while (!rotted_cells.empty()) {
cell cur_cell =rotted_cells.front();
rotted_cells.pop();
depth = cur_cell.depth;
int cur_row = cur_cell.row;
int cur_col = cur_cell.col;
// 这里要注意,别写错了,很容易出现堆栈溢出错误.
if (cur_row -1 >= 0 && 1 == grid[cur_row-1][cur_col]) {
grid[cur_row-1][cur_col] = 2;
rotted_cells.push({cur_row-1,cur_col,depth+1});
}
if (cur_row +1 < rows && 1 == grid[cur_row+1][cur_col]) {
grid[cur_row+1][cur_col] = 2;
rotted_cells.push({cur_row+1,cur_col,1+depth});
}
if (cur_col - 1>=0 && 1 == grid[cur_row][cur_col-1]) {
grid[cur_row][cur_col-1] = 2;
rotted_cells.push({cur_row,cur_col-1,1+depth});
}
if (cur_col +1 < cols && 1 == grid[cur_row][1+cur_col]) {
grid[cur_row][1+cur_col] = 2;
rotted_cells.push({cur_row,1+cur_col,1+depth});
}
}
for (auto row : grid)
for (auto col : row)
if ( 1 == col) return -1;
return depth;
}
};
扩展学习:
- 尽量使用emplace()代替push(),但是要注意很多问题, 详见下文"扩展学习-c++扩展学习之1."
扩展学习
- 刷Leetcode不是终点, 以刷题为线索学习相关知识才是正道.
- 不是说学一道题非得把方方面面的知识搞透才能进行下一道,那样的话一来进度太慢,二来你会逐渐偏离正轨----苦学数日,突然醒悟:我tm到底是打算干什么的来着??
不一定每个阶段都得100%没问题了再进入下一个阶段,那样你会止步于某个阶段的.
敏捷开发! 快速迭代啊 ! 这些名词天天挂在嘴上,装B啊?
活学活用知道不?举一反三行不行啊?你考不上好大学是有原因的知不知道?不是你没用功!也不是"当初只是我年少无知,不努力,要是我努力的话…"
c++扩展学习
- 使用emplace替代push.
-
插入操作会涉及到两次构造,首先是对象的初始化构造,接着在插入的时候还会复制一次,会触发拷贝构造。但是很多时候我们并不需要两次构造带来效率的浪费,如果可以在插入的时候直接构造,就只需要构造一次就够了。
emplace就干这个. -
there are still complicated cases where a push_back is likely to make unnecessary copies or move
- 使用for_each进行遍历,更高效,更准确,更好的维护性.
- Item 43: prefer algorithm calls(e.g. for_each) to hand-written loops.
- for循环的N种茴香豆写法