鏈結
給出乙個整數陣列 a 和乙個查詢陣列 queries。
對於第 i 次查詢,有 val = queries[i][0], index = queries[i][1],我們會把 val 加到 a[index] 上。然後,第 i 次查詢的答案是 a 中偶數值的和。
返回所有查詢的答案
先執行更新陣列操作,然後對偶數求和,序列。問題在於複雜度太高,超時
def
sumevenafterqueries
(a:'list[int]'
, queries:
'list[list[int]]')-
>
'list[int]'
: ans =
for query in queries:
# 更新陣列
a[query[1]
]+= query[0]
# 計算偶數和
sum=
sum(i for i in a if x %2==
0)sum)
return ans
可以對方法一中的部分情況進行判斷,減少計算的次數
利用奇偶相加還是奇數的原理進行剪枝在,只需要對當前修改位置元素的奇偶進行判斷,其餘位置的元素不會產生影響
def
sumevenafterqueries3
(a:'list[int]'
, queries:
'list[list[int]]')-
>
'list[int]'
: ans =
# 首先計算原始序列中的偶數和
ret =
sum(x for x in a if x %2==
0)for val, pos in queries:
# 這裡使用的是解包的技巧
if a[pos]%2
==0:# 如果修改位置是偶數,加上偶數還是偶數,總結果中加上。加上奇數變成奇數,總結果中減去
if val %2==
0:ret += val
else
: ret -= a[pos]
else
:# 如果修改位置是奇數,只有加上奇數的情況上才在總結果中加上
if val %2:
ret += val + a[pos]
a[pos]
+= val
return ans
c++
vector<
int>
sumevenafterqueries
(vector<
int>
& a, vectorint>>
& queries)
}for
(int i =
0; i < queries.
size()
; i++
)else
}else
else
} vi.
push_back
(ou);}
return vi;
}
不同的剪枝策略
如果當前項是偶數,計算出其餘的偶數和。如果是奇數,整體的偶數和就是其餘項的偶數和。
然後對當前項進行修改
修改後為偶數 則加到其餘項的偶數和中去
python
def
sumevenafterqueries4
(a:'list[int]'
, queries:
'list[list[int]]')-
>
'list[int]'
: ans =
ret =
sum(x for x in a if x %2==
0)for val, pos in queries:
# 第一步 計算出其餘未修改項中的偶數和
if a[pos]%2
==0: ret -= a[pos]
# 第二步 進行更新
a[pos]
+= val
# 第三步 判斷更新後的值
if a[pos]%2
==0: ret += a[pos]
return ans
LeetCode985 查詢後的偶數和
給出乙個整數陣列a和乙個查詢陣列queries。對於第i次查詢,有val queries i 0 index queries i 1 我們會把val加到a index 上。然後,第i次查詢的答案是a中偶數值的和。此處給定的index queries i 1 是從 0 開始的索引,每次查詢都會永久修改...
LeetCode 985 查詢後的偶數和
給出乙個整數陣列 a 和乙個查詢陣列 queries。對於第 i 次查詢,有 val queries i 0 index queries i 1 我們會把 val 加到 a index 上。然後,第 i 次查詢的答案是 a 中偶數值的和。此處給定的 index queries i 1 是從 0 開始...
LeetCode 985 查詢後的偶數和
給出乙個整數陣列 a 和乙個查詢陣列 queries。對於第 i 次查詢,有 val queries i 0 index queries i 1 我們會把 val 加到 a index 上。然後,第 i 次查詢的答案是 a 中偶數值的和。此處給定的 index queries i 1 是從 0 開始...