LeetCode.985-查询后偶数的总和(Sum of Even Numbers After Queries)
这是悦乐书的第370次更新,第398篇原创
01 看题和准备
今天介绍的是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 <= 10000
-10000 <= A[i] <= 10000
1 <= queries.length <= 10000
-10000 <= queries[i][0] <= 10000
0 <= queries[i][1] <A.length
02 第一种解法
直接翻译题目,找出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;
}
03 第二种解法
第一种解法的时间复杂度太高了,还可以再优化下。
结果数组中的值,后一位是在前一位的基础上产生的,主要判断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;
}
04小结
算法专题目前已连续日更超过七个月,算法题文章238+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode.985-查询后偶数的总和(Sum of Even Numbers After Queries)的更多相关文章
- 【LEETCODE】47、985. Sum of Even Numbers After Queries
package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...
- 【Leetcode_easy】985. Sum of Even Numbers After Queries
problem 985. Sum of Even Numbers After Queries class Solution { public: vector<int> sumEvenAft ...
- 【LeetCode】985. Sum of Even Numbers After Queries 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力 找规律 日期 题目地址:https://lee ...
- 985. Sum of Even Numbers After Queries
We have an array A of integers, and an array queries of queries. For the i-th query val = queries[i] ...
- [Solution] 985. Sum of Even Numbers After Queries
Difficulty: Easy Question We have an array A of integers, and an array queries of queries. For the i ...
- [Swift]LeetCode985. 查询后的偶数和 | Sum of Even Numbers After Queries
We have an array A of integers, and an array queries of queries. For the i-th query val = queries[i] ...
- 【leetcode】985. Sum of Even Numbers After Queries
题目如下: We have an array A of integers, and an array queries of queries. For the i-th query val = quer ...
- #Leetcode# 985. Sum of Even Numbers After Queries
https://leetcode.com/problems/sum-of-even-numbers-after-queries/ We have an array A of integers, and ...
- LeetCode 985 Sum of Even Numbers After Queries 解题报告
题目要求 We have an array A of integers, and an array queries of queries. For the i-th query val = queri ...
随机推荐
- H5实现手写功能
html <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf- ...
- RSA加密算法原理及RES签名算法简介(转载)
第一部分:RSA算法原理与加密解密 一.RSA加密过程简述 A和B进行加密通信时,B首先要生成一对密钥.一个是公钥,给A,B自己持有私钥.A使用B的公钥加密要加密发送的内容,然后B在通过自己的私钥解密 ...
- [Linux系统] (8)Nginx
一.高并发基础架构 简要流程: 1.客户端发请求. 2.又LVS等四层负载均衡系统将请求转发给不同的Nginx服务器. 3.Nginx与客户端建立TCP连接,拿到请求后分析URI,然后将其转发给对应的 ...
- jquery disabled选择器 语法
jquery disabled选择器 语法 作用:disabled 选择器选取所有禁用的表单元素.大理石平台价格表 语法:$(":disabled") jquery disable ...
- [JZOJ6244]【NOI2019模拟2019.7.1】Trominoes 【计数】
Description n,m<=10000 Solution 考虑暴力轮廓线DP,按顺序放骨牌 显然轮廓线长度为N+M 轮廓线也是单调的 1表示向上,0表示向右 N个1,M个0 只能放四种骨牌 ...
- wx.setStorage、wx.getStorage和wx.getStorageSync
Page({ data: { testnum:""//设置测试参数 }, test:function(){ var Num = this.data.testnum; wx.setS ...
- happens-before规则和as-if-serial语义
JSR-133使用happens-before的概念来阐述操作之间的内存可见性.在JMM中,如果一个操作执行的结果需要对另一个操作可见, 那么这2个操作之间必须要存在happens-before关系. ...
- AtCoder4351 Median of Medians 二分, 树状数组
题目大意 定义一个从小到大的数列的中位数为第 $ \frac{n}{2}+1 $ 项.求一个序列的所有连续子序列的中位数的中位数. $ (n \leqslant 100000)$ 问题分析 由于\(n ...
- R_Studio(学生成绩)使用主成分分析实现属性规约
对11_1_4.csv成绩表进行主成分分析处理 setwd('D:\\data') list.files() #读取数据 dat=read.csv(file="11_1_4.csv" ...
- CentOS 6.5上的Tomcat启动报错问题
最近在搭建虚拟机环境,装的是CentOSQL 6.5版本,然后装的OpenJDK1.7,在Apache下载了一个纯净的Tomcat放到虚拟机上启动报错了: 这里有两个错误: 1.第一个错误,APR的问 ...