Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[LeetCode] 985. Sum of Even Numbers After Queries #985

Open
grandyang opened this issue May 30, 2019 · 0 comments
Open

[LeetCode] 985. Sum of Even Numbers After Queries #985

grandyang opened this issue May 30, 2019 · 0 comments

Comments

@grandyang
Copy link
Owner

grandyang commented May 30, 2019

We have an array A of integers, and an array queries of queries.

For the i-th query val = queries[i][0], index = queries[i][1], we add val to A[index].  Then, the answer to the i-th query is the sum of the even values of A.

(Here, the givenindex = queries[i][1] is a 0-based index, and each query permanently modifies the array A.)

Return the answer to all queries.  Your answer array should have answer[i] as the answer to the i-th query.

Example 1:

Input: A = [1,2,3,4], queries = [[1,0],[-3,1],[-4,0],[2,3]]
Output: [8,6,2,4]
Explanation:
At the beginning, the array is [1,2,3,4].
After adding 1 to A[0], the array is [2,2,3,4], and the sum of even values is 2 + 2 + 4 = 8.
After adding -3 to A[1], the array is [2,-1,3,4], and the sum of even values is 2 + 4 = 6.
After adding -4 to A[0], the array is [-2,-1,3,4], and the sum of even values is -2 + 4 = 2.
After adding 2 to A[3], the array is [-2,-1,3,6], and the sum of even values is -2 + 6 = 4.

Note:

  1. 1 <= A.length <= 10000
  2. -10000 <= A[i] <= 10000
  3. 1 <= queries.length <= 10000
  4. -10000 <= queries[i][0] <= 10000
  5. 0 <= queries[i][1] < A.length

这道题给了一个数组A,说每次可以给数组某个位置上的数字加上一个值,每次操作后让返回当前数组中的偶数数之和。通过题目中的例子可以发现,加上的数字可能为负值,负偶数也是偶数。每次修改一个值后都要返回偶数之和,肯定不能每次都遍历一遍数组求偶数和,太不高效了,其实每次只修改了一个数字,这个数字对整个数组的偶数和的影响有限,可以分情况来讨论一下。假如修改之前,该数字就是偶数,修改后若变为奇数,则损失了原来的偶数值,若修改后还是偶数,则相当于先损失了原来的偶数,又加上了新的偶数。若修改之前,该数字是奇数,修改后若还是奇数,则什么也不影响,若修改后变为了偶数,则相当于加上了这个偶数。所以归纳起来就是,先判断修改前的数字,若是偶数,则减去这个偶数,再判断修改后的数字,若是偶数,则加上这个偶数。这样的话只要最开始遍历一遍数组,求出所有偶数之和,之后修改数字时只要按上面的步骤就可以快速获得偶数之和了,参见代码如下:

class Solution {
public:
    vector<int> sumEvenAfterQueries(vector<int>& A, vector<vector<int>>& queries) {
        vector<int> res;
        int n = A.size(), even = 0;
        for (int num : A) {
            if (num % 2 == 0) even += num;
        }
        for (auto &query : queries) {
            int old = A[query[1]], cur = old + query[0];
            if (old % 2 == 0) even -= old;
            if (cur % 2 == 0) even += cur;
            A[query[1]] = cur;
            res.push_back(even);
        }
        return res;
    }
};

Github 同步地址:

#985

参考资料:

https://leetcode.com/problems/sum-of-even-numbers-after-queries/

https://leetcode.com/problems/sum-of-even-numbers-after-queries/discuss/231098/C%2B%2B-O(n)-track-even-sum

https://leetcode.com/problems/sum-of-even-numbers-after-queries/discuss/231099/JavaPython-3-odd-even-analysis-time-O(max(m-n))

LeetCode All in One 题目讲解汇总(持续更新中...)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant