这是悦乐书的第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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是所有内容,若是你们有什么好的解法思路、建议或者其余问题,能够下方留言交流,点赞、留言、转发就是对我最大的回报和支持!