LeetCode动态规划第一天: Brick Wall

本文探讨了LeetCode上的砖墙问题(554. Brick Wall),最初尝试使用动态规划解决,但最终发现只需用字典进行计数即可获得最优解。文章详细介绍了两种思路的分析过程。

    话说自从找完工作,整个人瞬间咸鱼了,最近才缓过来。看到Leetcode 800+题目真是心灰意冷,但即使这样,也不能够停下脚步了。

    目前先找一个专题往死里怼,以期断其一指。先拿动态规划开刀。


554Brick 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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值