Reputation: 25
assume you are given
A=[2, 5, 7, 2, 6, 7, 6, 5, 6, 5].
Sum=[0, 0, 0, 12, 0, 8, 7, 28, 5, 6].
use O(n) extra space and **must run in O(n) time****.
Upvotes: 0
Views: 74
Reputation: 217135
If you are allowed to use std::unordered_map
, you might use something like:
auto IntervalSum(const std::vector<int>& A)
{
std::vector<int> res;
std::unordered_map<int, int> m;
int sum = 0;
for (auto e : A) {
sum += e;
if (auto [it, inserted] = m.emplace(e, sum); !inserted) {
res.push_back(sum - e - it->second);
it->second = sum;
} else {
res.push_back(0);
}
}
return res;
}
The C++17 construct
if (auto [it, inserted] = m.emplace(e, sum); !inserted) {
might be rewritten in previous version (C++11/C++14):
auto p = m.emplace(e, sum);
auto it = p.first;
bool inserted = p.second;
if (!inserted) {
Upvotes: 1