Last Updated on 2022-09-21 by Clay
題目
You are given an integer array nums
and an array queries
where queries[i] = [vali, indexi]
.
For each query i
, first, apply nums[indexi] = nums[indexi] + vali
, then print the sum of the even values of nums
.
Return an integer array answer
where answer[i]
is the answer to the ith
query.
Example 1:
Input: nums = [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 nums[0], the array is [2,2,3,4], and the sum of even values is 2 + 2 + 4 = 8. After adding -3 to nums[1], the array is [2,-1,3,4], and the sum of even values is 2 + 4 = 6. After adding -4 to nums[0], the array is [-2,-1,3,4], and the sum of even values is -2 + 4 = 2. After adding 2 to nums[3], the array is [-2,-1,3,6], and the sum of even values is -2 + 6 = 4.
Example 2:
Input: nums = [1], queries = [[4,0]] Output: [0]
Constraints:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
1 <= queries.length <= 104
-104 <= vali <= 104
0 <= indexi < nums.length
題目會給予一組數值 nums
以及一串查詢 queries
。queries
中的第一個值是要加上去的數值,第二個數值則是要加的 nums
位置。
而我們需要把每次加值後的新 nums
,我們需要把當中所有的『偶數』值加總,最後返回一組紀錄了過程中每次改動值後 nums
中的偶數值加總值的陣列。
解題思路
這題的限制設定得很巧妙,使用雙層 for 迴圈的話一定過不了測試(TLE)。
所以最單純的暴力法就是:我們一開始就計算好了 nums
中所有偶數值加總值,接下來再每次改動值時,分別對加總值進行調整,最後才紀錄進要回傳的陣列。
而改動 nums
分成四種狀況:
- 舊值為偶數、加值為偶數: 把當前加總值再加上加值即可
- 舊值為偶數、加值為奇數: 把當前加總值減去舊值
- 舊值為奇數、加值為偶數: 新值仍為奇數,當前加總值不變
- 舊值為奇數、加值為奇數: 把當前加總值加上新值
這樣就可以在一層 for 迴圈中計算出所有偶數加總值答案。
C++ 範例程式碼
class Solution {
public:
vector<int> sumEvenAfterQueries(vector<int>& nums, vector<vector<int>>& queries) {
// Init
vector<int> results;
int sum = 0;
for (auto& n: nums) {
if (n % 2 == 0) {
sum += n;
}
}
// Add
for (int i=0; i<queries.size(); ++i) {
int _add = queries[i][0];
int _old = nums[queries[i][1]];
nums[queries[i][1]] += queries[i][0];
int _new = nums[queries[i][1]];
if (_old % 2 == 0) {
if (_add % 2 == 0) {
sum += _add;
}
else {
sum -= _old;
}
}
else {
if (_add % 2 != 0) {
sum += _new;
}
}
results.push_back(sum);
}
return results;
}
};
Python 範例程式碼
class Solution:
def sumEvenAfterQueries(self, nums: List[int], queries: List[List[int]]) -> List[int]:
# Init
results = []
_sum = sum([n for n in nums if n % 2 == 0])
# Add
for query in queries:
_add = query[0]
_old = nums[query[1]]
nums[query[1]] += _add
_new = nums[query[1]]
if _old % 2 == 0:
if _add % 2 == 0:
_sum += _add
else:
_sum -= _old
else:
if _add % 2 != 0:
_sum += _new
results.append(_sum)
return results
一定還有更快的做法,但是今天就比較沒空。暴力了事 OWO