话说自从找完工作,整个人瞬间咸鱼了,最近才缓过来。看到Leetcode 800+题目真是心灰意冷,但即使这样,也不能够停下脚步了。
目前先找一个专题往死里怼,以期断其一指。先拿动态规划开刀。
554. Brick Wall
第一思路
墙的每一行相当于一个整数集合,通过元素依次相加得到不同的和。最优化结果即某一个数字可以由最多的行累加得到。砍掉末尾一行,来得到一个优化子结构。子结构中保存两个集合,最多的集合和少一个的集合。当新增一行的时候,就可以看新的和的集合是否在最多的集合中,是则数量+1,否则数量不变。而少一个的集合需要用来维护加一行之后的最多集合。
注意:每一行累加到最后的和不要取。
问题:数量为n的集合,需要通过数量为n-1的集合维护,导致链式维护集合。不可取。
第二思路
搞错题目了...根本不用动态规划。直接一个字典计数就搞定了。需要注意的是max_num这个变量初始为零。
class Solution {
public:
int leastBricks(vector<vector<int>>& wall) {
map<int, int> cnt;
for (int row = 0; row < wall.size(); row++) {
int sum_cur = 0;
for (int i = 0; i < wall[row].size()-1; i++) {
sum_cur += wall[row][i];
if (cnt.find(sum_cur) != cnt.end())
cnt[sum_cur]++;
else
cnt.insert(pair<int,int>(sum_cur, 1));
}
}
int max_num = 0;
for (map<int,int>::iterator it = cnt.begin(); it != cnt.end(); it++) {
max_num = max(max_num, it->second);
}
return wall.size() - max_num;
}
};
本文探讨了LeetCode上的砖墙问题(554. Brick Wall),最初尝试使用动态规划解决,但最终发现只需用字典进行计数即可获得最优解。文章详细介绍了两种思路的分析过程。
389

被折叠的 条评论
为什么被折叠?



