我正在解决一个leetcode问题,运行它时代码可以正常工作,但是提交代码时出现Time Limit Exceeded错误。我仔细检查了代码,但没有发现任何无限循环。谁能帮我看看。
下面是leetcode问题描述:
我们有一个整数数组A,还有一个查询数组查询。
对于第i个查询val = querys [i] [0],index = querys [i] [1],我们将val添加到A [index]。然后,第i个查询的答案是A的偶数值之和。
(在这里,给定的索引= querys [i] [1]是从0开始的索引,每个查询都会永久修改数组A。)
返回所有查询的答案。您的答案数组应将answer [i]作为第i个查询的答案。
示例1:
输入:A = [1,2,3,4],查询= [[1,0],[-3,1],[-4,0],[2,3]] 输出:[8,6,2,4] 说明: 开始时,数组为[1,2,3,4]。 将1加到A [0]后,数组为[2,2,3,4],偶数之和为2 + 2 + 4 = 8。 将A-3加到[1]后,数组为[2,-1,3,4],偶数之和为2 + 4 = 6。 将A-4加到[0]后,数组为[-2,-1,3,4],偶数之和为-2 + 4 = 2。 在A [3]上加上2后,数组为[-2,-1,3,6],偶数之和为-2 + 6 = 4。
class Solution {
public:
vector<int> sumEvenAfterQueries(vector<int>& A, vector<vector<int>>& queries) {
vector<int> B;
for(int i = 0; i < queries.size(); i++)
{
int index = queries[i][1];
A[index] = A[index] + queries[i][0];
int sum = 0;
for(int j = 0; j < A.size(); j++)
{
if(A[j]%2 == 0)
{
sum = sum + A[j];
}
}
B.push_back(sum);
}
return B;
}
};
答案 0 :(得分:3)
由于您的算法太幼稚,您可能超出了时间限制。通过重新计算每个查询的总和,您的程序的时间复杂度为O(M * N),其中M是数组的大小,N是查询数。
几乎可以保证测试集将被设计为在幼稚的实现中失败(超过时间限制)。
绝对不需要每次都重新计算总和。您只需一次进行计算。
此后,每次查询时,您只需要使用已更改的 更新当前总和。更新时,请使用程序对先前值和新值(是否为即的一部分)的了解。
这样做,您的程序的时间复杂度变为O(M + N)。