[LeetCode] Burst Balloons (Medium)
这题没有做出来. 自己的思路停留在暴力的解法, 时间复杂度很高:
- 初始化
maxCount = 0. - 对于当前长度为
k的数组nums, 从0到k - 1逐个选取第i个气球扎破- 计算扎破气球得到的金币数,
count = nums[i - 1] * nums[i] * nums[i + 1]. - 从
nums中删掉nums[i]. - 查询
m[nums]是否存在, 不存在则递归调用maxCoins(nums)并插入m[nums]. count += m[nums]后就是本轮的最优解, 若count > maxCount则更新maxCount.- 恢复
nums[i]回到nums中.
- 计算扎破气球得到的金币数,
- 返回
maxCount.
class Solution {
private:
map<vector<int>, int> m;
public:
int maxCoins(vector<int>& nums) {
int len = nums.size();
if (len <= 0) return 0;
if (len == 1) return nums[0];
int maxCount = 0;
for (int i = 0; i < len; ++i) {
int val = nums[i];
int count = nums[i];
if (i - 1 >= 0) {
count *= nums[i - 1];
}
if (i + 1 < len) {
count *= nums[i + 1];
}
nums.erase(nums.begin() + i);
auto it = m.find(nums);
if (it == m.end()) {
count += (m[nums] = maxCoins(nums));
} else {
count += it->second;
}
maxCount = max(maxCount, count);
nums.insert(nums.begin() + i, val);
}
return maxCount;
}
};
这个算法如果不加memo, 在第i次选择时有n - i个选择 (i = 0 ~ n-1), 所以一共有n!次选择, 每次选择都要进行O(n)时间复杂度的删气球和回填气球的操作查找vector的时间复杂度是多少?, 故时间复杂度O(n*n!), n层递归故空间复杂度O(n).
如上加了memo之后, 对于每种输入情况只计算一次, 对于k个气球, 有C(n, k)中情况 (k = 1~n), 一共是2^n种情况, 同上要考虑增删气球的时间复杂度, 所以时间复杂度最好也是O(n*2^n). 这2^n种情况都要保存在memo中, 每种输入的平均长度是O(n)级别的, 因此空间复杂度是O(n*2^n).
总之, TLE.
看了Share some analysis and explanations之后写下了下面的算法.
class Solution {
private:
map<pair<int, int>, int> m;
int maxCoins(vector<int> &nums, int left, int right, int lv, int rv) {
if (left > right) return 0;
if (left == right) return nums[left] * lv * rv;
auto coor = make_pair(left, right);
auto it = m.find(coor);
if (it != m.end()) {
return it->second;
}
int maxCount = 0;
for (int i = left; i <= right; ++i) {
int count = nums[i] * lv * rv
+ maxCoins(nums, left, i - 1, lv, nums[i])
+ maxCoins(nums, i + 1, right, nums[i], rv);
maxCount = max(maxCount, count);
}
m[coor] = maxCount;
return maxCount;
}
public:
int maxCoins(vector<int>& nums) {
int len = nums.size();
if (len <= 0) return 0;
return maxCoins(nums, 0, len - 1, 1, 1);
}
};
// Runtime: 1428ms
时间复杂度O(n^3). 起止点共有C(n, 2)个组合, 是O(n^2)级别的. 对于每个组合要遍历一遍, 找最大. 所以整体是O(n^3).
空间复杂度O(n^2).
小优化:
- 删掉0. (Runtime: 1300ms).
- 改用数组做map (Runtime: 36ms). 没想到数组比map好用这么多, 为什么?
class Solution {
private:
int maxCoins(vector<int> &nums, int left, int right, int lv, int rv, int* memo, int n) {
if (left > right) return 0;
if (left == right) return nums[left] * lv * rv;
if (memo[left * n + right] != 0) return memo[left * n + right];
int maxCount = 0;
for (int i = left; i <= right; ++i) {
int count = nums[i] * lv * rv
+ maxCoins(nums, left, i - 1, lv, nums[i], memo, n)
+ maxCoins(nums, i + 1, right, nums[i], rv, memo, n);
maxCount = max(maxCount, count);
}
memo[left * n + right] = maxCount;
return maxCount;
}
public:
int maxCoins(vector<int>& nums) {
int len = nums.size();
if (len <= 0) return 0;
int n = 0;
for (int x : nums) if (x > 0) nums[n++] = x;
int memo[n][n] = {};
return maxCoins(nums, 0, n - 1, 1, 1, (int*)memo, n);
}
};
标准答案:
class Solution {
public:
int maxCoins(vector<int>& iNums) {
int nums[iNums.size() + 2];
int n = 1;
for (int x : iNums) if (x > 0) nums[n++] = x;
nums[0] = nums[n++] = 1;
int dp[n][n] = {};
for (int k = 2; k <= n; ++k) {
for (int L = 0; L <= n - k; ++L) {
int R = L + k;
for (int i = L + 1; i < R; ++i) {
dp[L][R] = max(dp[L][R], nums[L] * nums[i] * nums[R] + dp[L][i] + dp[i][R]);
}
}
}
return dp[0][n - 1];
}
};
// Runtime: 12ms
其中dp[i][j]表示第i个气球到第j个气球能获取的最大金币数 (i最小为-1, j最大为n).
[LeetCode] Burst Balloons (Medium)的更多相关文章
- [LeetCode] Burst Balloons 打气球游戏
Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by ...
- LeetCode Burst Balloons
原题链接在这里:https://leetcode.com/problems/burst-balloons/ 题目: Given n balloons, indexed from 0 to n-1. E ...
- LeetCode 312. Burst Balloons(戳气球)
参考:LeetCode 312. Burst Balloons(戳气球) java代码如下 class Solution { //参考:https://blog.csdn.net/jmspan/art ...
- 【LeetCode】452. Minimum Number of Arrows to Burst Balloons 解题报告(Python)
[LeetCode]452. Minimum Number of Arrows to Burst Balloons 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https ...
- LN : leetcode 312 Burst Balloons
lc 312 Burst Balloons 312 Burst Balloons Given n balloons, indexed from 0 to n-1. Each balloon is pa ...
- 贪心:leetcode 870. Advantage Shuffle、134. Gas Station、452. Minimum Number of Arrows to Burst Balloons、316. Remove Duplicate Letters
870. Advantage Shuffle 思路:A数组的最大值大于B的最大值,就拿这个A跟B比较:如果不大于,就拿最小值跟B比较 A可以改变顺序,但B的顺序不能改变,只能通过容器来获得由大到小的顺 ...
- 动态规划-Burst Balloons
Burst Balloons Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it ...
- [LeetCode] Minimum Number of Arrows to Burst Balloons 最少数量的箭引爆气球
There are a number of spherical balloons spread in two-dimensional space. For each balloon, provided ...
- [LeetCode] 312. Burst Balloons 打气球游戏
Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by ...
随机推荐
- CDOJ-10(栈的应用)
In Galgame We Trust Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Othe ...
- java Spring bean作用域
1. Singleton作用域 当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则 ...
- Android线程与异步消息处理机制
在程序开发时,对于一些比较耗时的操作,我们通常会为其开辟一个单独的线程来执行,这样可以尽可能的减少用户等待的时间.在Android中,默认情况下,所有的操作都是在主线程中进行的,这个主线程负责管理与U ...
- ACM/ICPC ZOJ1009-Enigma 解题代码
#include <iostream> #include <string> using namespace std; int main() { int strwide; cin ...
- 关于使用用友华表Cell控件按需打印行的方法
分享下只需一个cll文件按需打印行的觉得最好的方式:1.cell文件要打印行的地方最好不要全删了,留一行,设置好单元格样式(字体.对齐方式.折行自适应等),后面会省一些代码: 2.使用CopyRang ...
- C#微信开发之旅--自定义菜单
上一篇说道基本信息的回复<C#微信开发之旅--基本信息的回复>,当中就说到文本信息的回复,其他信息的回复,可以参考下开发文档中回复信息的格式进行修改就可以. 下面来实现下自定义菜单.据我了 ...
- windows server 2003 取消登录Ctrl+Alt+delete
安装Windows Server 2003操作系统的, 在console登录默认要先按下Ctrl+Alt+Delete组合键然后才弹出登录对话框 要取消这个限制的方法是: 点击 “开始-->运行 ...
- [翻译]ASP.NET Web API 2入门
原文:Getting Started with ASP.NET Web API 2 Step 1:新建一个Empty的Web API Project. Step 2:添加一个Model: public ...
- iframe 的基本操作
要在服务器环境下才行 1.iframe 下操作父页面window.parent.document.getElementById //全部支持window.top //最顶层ie 下的iframe的on ...
- 关于Hyper-V虚拟机中的vEthernet虚拟网卡不能联网的问题
Hyper-V虚拟机在我电脑里面已经有一年了,当初是因为windows8系统里面需要装Hyper-V,这样才能不让win8死机,就折腾了一整子,结果碰到vEthernet网卡不能联网,网上相关的资料少 ...