leetcode刷题全笔记

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

伪伪代码 :

  1. 用struct cell 存储一个单元格信息,包括{行,列,深度}, 这里采用BFS,深度就是消耗的时间;
  2. 用队列rotted_cells存储具有传染性的腐败橘子: 遍历grid,将所有腐烂的橘子入队;
  3. 从队头依次处理腐败橘子,它的上下左右如果是新鲜的就是可以传染的: 处理过的cell 弹出, 下一个,直到队列为空.
  4. 再次遍历grid, 如果此时还有新鲜的,说明它是个不会被传染的孤岛,会一直新鲜下去, return -1;
  5. 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;
    }
};

扩展学习:

  1. 尽量使用emplace()代替push(),但是要注意很多问题, 详见下文"扩展学习-c++扩展学习之1."

扩展学习

  • 刷Leetcode不是终点, 以刷题为线索学习相关知识才是正道.
  • 不是说学一道题非得把方方面面的知识搞透才能进行下一道,那样的话一来进度太慢,二来你会逐渐偏离正轨----苦学数日,突然醒悟:我tm到底是打算干什么的来着??
    不一定每个阶段都得100%没问题了再进入下一个阶段,那样你会止步于某个阶段的.

敏捷开发! 快速迭代啊 ! 这些名词天天挂在嘴上,装B啊?

活学活用知道不?举一反三行不行啊?你考不上好大学是有原因的知不知道?不是你没用功!也不是"当初只是我年少无知,不努力,要是我努力的话…"

c++扩展学习

  1. 使用emplace替代push.
  1. 使用for_each进行遍历,更高效,更准确,更好的维护性.
  1. Item 43: prefer algorithm calls(e.g. for_each) to hand-written loops.
  2. for循环的N种茴香豆写法

c 扩展学习

python 扩展学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值