“Better code, better life. ”
ARTS打卡第七周
Algorithm
[题目] :https://leetcode-cn.com/problems/unique-paths-ii/solution/
[题解] :
一道最典型的动态规划题目,这里注意一下如何用malloc来创建二位数组
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>> &obstacleGrid) {
int **p = nullptr, i, j, row = obstacleGrid.size(), col = obstacleGrid[0].size();
p = static_cast<int **>(malloc(sizeof(int *) * row));
for (i = 0; i < obstacleGrid.size(); ++i) {
*(p + i) = static_cast<int *>(malloc(sizeof(int) * col));
std::memset(*(p + i), '\0', sizeof(int) * col);
}
for (i = 0; i < col; ++i) {
if (obstacleGrid[0][i] == 1)break;
p[0][i] = 1;
}
for (j = 0; j < row; ++j) {
if (obstacleGrid[j][0] == 1)break;
p[j][0] = 1;
}
for (i = 1; i < col; ++i) {
for (j = 1; j < row; ++j) {
if (obstacleGrid[j][i] == 1)continue;
p[j][i] = p[j - 1][i] + p[j][i - 1];
}
}
return p[row - 1][col - 1];
}
};
Review
[文章链接] :http://www.wangafu.net/~nickm/libevent-book/Ref6_bufferevent.html
[笔记] :
延迟回调
默认情况下,当发生相应条件时,会立即执行bufferevent回调。(evbuffer回调也是这样)当依赖关系变得复杂时,这种直接调用会造成麻烦。例如,假设有一个回调,如果evbuffer A变为空,它将数据移到A中;而另外一个回调,当A为满时,处理A中的数据。由于这些调用发生在栈上,如果情况足够复杂,有可能出现栈溢出。
为了解决这个问题,您可以告诉bufferevent(或evbuffer)应推迟其回调。 当满足延迟回调的条件时,而不是立即调用它,则将它作为event_loop()调用的一部分排队,并在常规事件的回调之后调用。
Tips
上周写的CTP程序会在非交易时间断开连接,需要一个守护进程来自动拉起该服务,于是看了下monit的官方文档,搭建了一个守护进程服务