这是悦乐书的第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)Mqueries的长度,NA的长度,空间复杂度为O(M)Mqueries的长度。

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)Mqueries的长度,空间复杂度为O(M)Mqueries的长度。

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)的更多相关文章

  1. 【LEETCODE】47、985. Sum of Even Numbers After Queries

    package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...

  2. 【Leetcode_easy】985. Sum of Even Numbers After Queries

    problem 985. Sum of Even Numbers After Queries class Solution { public: vector<int> sumEvenAft ...

  3. 【LeetCode】985. Sum of Even Numbers After Queries 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力 找规律 日期 题目地址:https://lee ...

  4. 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] ...

  5. [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 ...

  6. [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] ...

  7. 【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 ...

  8. #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 ...

  9. 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 ...

随机推荐

  1. H5实现手写功能

    html <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf- ...

  2. RSA加密算法原理及RES签名算法简介(转载)

    第一部分:RSA算法原理与加密解密 一.RSA加密过程简述 A和B进行加密通信时,B首先要生成一对密钥.一个是公钥,给A,B自己持有私钥.A使用B的公钥加密要加密发送的内容,然后B在通过自己的私钥解密 ...

  3. [Linux系统] (8)Nginx

    一.高并发基础架构 简要流程: 1.客户端发请求. 2.又LVS等四层负载均衡系统将请求转发给不同的Nginx服务器. 3.Nginx与客户端建立TCP连接,拿到请求后分析URI,然后将其转发给对应的 ...

  4. jquery disabled选择器 语法

    jquery disabled选择器 语法 作用:disabled 选择器选取所有禁用的表单元素.大理石平台价格表 语法:$(":disabled") jquery disable ...

  5. [JZOJ6244]【NOI2019模拟2019.7.1】Trominoes 【计数】

    Description n,m<=10000 Solution 考虑暴力轮廓线DP,按顺序放骨牌 显然轮廓线长度为N+M 轮廓线也是单调的 1表示向上,0表示向右 N个1,M个0 只能放四种骨牌 ...

  6. wx.setStorage、wx.getStorage和wx.getStorageSync

    Page({ data: { testnum:""//设置测试参数 }, test:function(){ var Num = this.data.testnum; wx.setS ...

  7. happens-before规则和as-if-serial语义

    JSR-133使用happens-before的概念来阐述操作之间的内存可见性.在JMM中,如果一个操作执行的结果需要对另一个操作可见, 那么这2个操作之间必须要存在happens-before关系. ...

  8. AtCoder4351 Median of Medians 二分, 树状数组

    题目大意 定义一个从小到大的数列的中位数为第 $ \frac{n}{2}+1 $ 项.求一个序列的所有连续子序列的中位数的中位数. $ (n \leqslant 100000)$ 问题分析 由于\(n ...

  9. R_Studio(学生成绩)使用主成分分析实现属性规约

    对11_1_4.csv成绩表进行主成分分析处理 setwd('D:\\data') list.files() #读取数据 dat=read.csv(file="11_1_4.csv" ...

  10. CentOS 6.5上的Tomcat启动报错问题

    最近在搭建虚拟机环境,装的是CentOSQL 6.5版本,然后装的OpenJDK1.7,在Apache下载了一个纯净的Tomcat放到虚拟机上启动报错了: 这里有两个错误: 1.第一个错误,APR的问 ...