這是悅樂書的第370次更新,第398篇原創
java
今天介紹的是LeetCode
算法題中Easy
級別的第232
題(順位題號是985
)。有一個整數數組A和一個查詢數組queries。算法
對於第i個查詢val = queries[i][0]
,index = queries[i][1]
,咱們將val
添加到A[index]
。而後,第i
個查詢的答案是A
的偶數值的總和。(這裏給定的index = queries[i][1]
是一個基於0的索引,每一個查詢都會修改數組A
。)數組
返回全部查詢的答案。你的答案數組answer
應該是answer[i]
做爲第i
個查詢的答案。例如:數據結構
輸入:A = [1,2,3,4],queries = [[1,0],[-3,1],[-4,0],[2,3]]
輸出:[8,6,2,4]
說明:一開始,數組是[1,2,3,4]。
在向A[0]
加1後,數組爲[2,2,3,4],偶數值之和爲2 + 2 + 4 = 8。
在向A[1]
加-3後,數組爲[2,-1,3,4],偶數值之和爲2 + 4 = 6。
在向A[0]
加上-4後,數組爲[-2,-1,3,4],偶數值之和爲-2 + 4 = 2。
在向A[3]
加2後,數組爲[-2,-1,3,6],偶數值之和爲-2 + 6 = 4。優化
注意:翻譯
1 <= A.length <= 10000code
-10000 <= A[i] <= 10000索引
1 <= queries.length <= 10000class
-10000 <= queries[i][0] <= 10000基礎
0 <= queries[i][1] <A.length
直接翻譯題目,找出queries
中對應的索引和val
,改變A中對應元素的的值,接着利用循環求A
中偶數元素的總和,賦值給結果數組result
。
此解法的時間複雜度爲O(M*N)
,M
爲queries
的長度,N
爲A
的長度,空間複雜度爲O(M)
,M
爲queries
的長度。
public int[] sumEvenAfterQueries(int[] A, int[][] queries) { int len = queries.length; int[] result = new int[len]; for (int i=0; i<len; i++) { A[queries[i][1]] += queries[i][0]; result[i] = evenSum(A); } return result; } public int evenSum(int[] A){ int sum = 0; for (int num : A) { if (num%2==0) { sum += num; } } return sum; }
第一種解法的時間複雜度過高了,還能夠再優化下。
結果數組中的值,後一位是在前一位的基礎上產生的,主要判斷A
中的當前位元素值、queries中
的值的奇偶性。拿題目給的示例來看,在第二次操做後,A
變成了[2,-1,3,4]
,將第一次操做後的數組A=[2,2,3,4]
中的第二個元素變成了-1,而第一次操做的偶數元素和是8,如今第二個元素變成了奇數,就須要將第一次加的2給減掉,因此第二次操做後的偶數和變成了8-2=6,剩下的幾步操做均可以這樣理解。
所以,咱們就須要判斷當前要操做的的A[i]
的奇偶和queries[i][0]
的奇偶,能夠分爲四種狀況:
第一種狀況:queries[i][0]
爲偶數、A[i]
也爲偶數,即前一次的求和中有A[i]
,只需加上queries[i][0]
的值便可,即sum = sum + queries[i][0]
。
第二種狀況:queries[i][0]
爲偶數、A[i]
爲奇數,即前一次的求和中沒有A[i]
,而且A[i]加上queries[i][0]
後也是奇數,因此不用更新sum
的值。
第三種狀況:queries[i][0]
爲奇數、A[i]
爲偶數,即前一次的求和中有A[i]
,如今A[i]
加上queries[i][0]
後變成了奇數,須要將前一次求和中的A[i]
減掉,即sum = sum - A[i]
。
第四種狀況:queries[i][0]
爲奇數、A[i]
也爲奇數,即前一次的求和中沒有A[i]
,可是A[i]
加上queries[i][0]
後變成了偶數,須要把這個新的偶數加到sum
上,即sum = sum + queries[i][0] + A[i]
。
在計算完sum
的值後,將sum賦值給新數組對應位置元素,將ueries[i][0] + A[i]
的值賦值給A[i]
,最後返回結果數組。
此解法的時間複雜度爲O(M)
,M
爲queries
的長度,空間複雜度爲O(M)
,M
爲queries
的長度。
public int[] sumEvenAfterQueries2(int[] A, int[][] queries) { int sum = 0, i = 0; for (int num : A) { if (num%2 == 0) { sum += num; } } int[] result = new int[queries.length]; for (int[] arr : queries) { int curval = arr[0]; int preval = A[arr[1]]; // 作奇偶判斷 if (curval%2 == 0) { if (preval%2 == 0) { sum = sum + curval; } } else { if (preval%2 == 0) { sum = sum - preval; } else { sum = sum + curval + preval; } } A[arr[1]] += curval; result[i++] = sum; } return result; }
算法專題目前已連續日更超過七個月,算法題文章238+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。
以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!