class Solution { public: int helper(vector<int>& n, vector<int>& cache, int startIndex) { if(startIndex>=n.size()) return INT_MIN; if(cache[startIndex]!=-1) return cache[startIndex]; int allInclusiveSum=0, sumWithOneDel=0, lowestVal=INT_MAX, maxVal=INT_MIN; for(int i=startIndex; i<n.size(); i++) { allInclusiveSum+=n[i]; maxVal=max(maxVal, allInclusiveSum); if(i!=startIndex) { lowestVal=min(lowestVal, n[i]); sumWithOneDel=allInclusiveSum-lowestVal; maxVal=max(maxVal, sumWithOneDel); } } maxVal=max(maxVal, helper(n, cache, startIndex+1)); return cache[startIndex]=maxVal; } int maximumSum(vector<int>& arr) { int i=0, first=arr[0]; for(i=1; i<arr.size(); i++) if(arr[i]!=first) break; if(i==arr.size()) return first; vector<int> cache(arr.size(), -1); return helper(arr, cache, 0); } };
不幸的是,这是TLES。由于我使用startindex+1
递归调用,所以我并不真的认为我遇到了重叠的子问题。
有办法让我记住我的解决方案吗?如果没有,为什么?
对于动态编程,我们只需定义一个包含N行和两列的std::vector
,然后一次运行arr
,并使用std::max
查找max_sum
:
#include <vector>
#include <algorithm>
class Solution {
public:
static inline int maximumSum(const std::vector<int> &arr) {
int length = arr.size();
std::vector<std::vector<int>> dynamic_sums(length, std::vector<int>(2, 0));
dynamic_sums[0][0] = arr[0];
int max_sum = arr[0];
for (unsigned int row = 1; row < length; row++) {
dynamic_sums[row][0] = std::max(arr[row], dynamic_sums[row - 1][0] + arr[row]);
dynamic_sums[row][1] = std::max(arr[row], std::max(dynamic_sums[row - 1][1] + arr[row], dynamic_sums[row - 1][0]));
max_sum = std::max(max_sum, std::max(dynamic_sums[row][0], dynamic_sums[row][1]));
}
return max_sum;
}
};
同样是O(N)时间和O(N)内存。
我想创建一个程序来模拟Unix服务器上的内存不足(OOM)情况。我创造了这个超级简单的记忆食客: 它消耗的内存与中定义的一样多,现在正好是50 问题是它是有效的。即使在具有1的系统上 当我检查top时,我看到这个过程消耗了50 系统规范:Linux内核3.16(Debian)很可能启用了Overmit(不知道如何检查),没有交换和虚拟化。
问题内容: 我想创建一个程序来模拟Unix服务器上的内存不足(OOM)情况。我创建了这个超级简单的内存消耗者: 它消耗的内存与定义的内存一样多,而现在恰好是50 GB的RAM。它按1 MB分配内存,并精确打印无法分配更多内存的点,这样我就知道它设法吃了哪个最大值。 问题是它有效。即使在具有1 GB物理内存的系统上。 当我检查顶部时,我发现该进程占用了50 GB的虚拟内存,而占用的驻留内存不到1 M
使用Java的工作代码: C++代码用dictionary[“Apple”,“Pen”]返回“ApplePenApple”的false,我不知道为什么java返回true是正确的。这两种解决方案之间唯一的主要区别(我认为)是我的C++在java代码中使用向量而不是原生数组。最初,我认为这可能与C++使用自动存储(堆栈)而不是自由存储(堆)有关,这就是为什么我使用向量而不是C样式的数组来避免内存管理
写一个函数均衡器(w1,w2),它包含两个不同长度的单词w1和w2。函数应该返回重复的较小单词,直到它达到长单词的长度
我需要将12小时的时间转换为24小时的格式。 我现在已经把12小时的时间硬编码了,以使事情更简单。 我的逻辑:输入sting 07:05:45PM提取最后2个字符。如果AM check为前两个字符,则为12。。如果是,则将其设置为00,否则按原样输出,如果PM检查前两位数字是否为12。。如果是,请保持原样,如果不是,则在前2位加上12 总线错误:10是我运行代码得到的
用户: 而此错误显示为: