在Leetcode

时间:2019-03-29 02:33:45

标签: c++

我正在解决一个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;
    }
};

1 个答案:

答案 0 :(得分:3)

由于您的算法太幼稚,您可能超出了时间限制。通过重新计算每个查询的总和,您的程序的时间复杂度为O(M * N),其中M是数组的大小,N是查询数。

几乎可以保证测试集将被设计为在幼稚的实现中失败(超过时间限制)。

绝对不需要每次都重新计算总和。您只需一次进行计算。

此后,每次查询时,您只需要使用已更改的 更新当前总和。更新时,请使用程序对先前值和新值(是否为的一部分)的了解。

这样做,您的程序的时间复杂度变为O(M + N)。