Leetcode 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]

     将 1 加到A[0]上之后,数组为[2,2,3,4],偶数之和为2+2+4 = 8

     将 -3 加到A[0]上之后,数组为[2,-1,3,4],偶数之和为2+4 = 6

     将 -4 加到A[0]上之后,数组为[-2,-1,3,4],偶数之和为 -2+4 = 2

     将 2 加到A[0]上之后,数组为[-2,-1,3,6],偶数之和为-2+6 = 4

解题思路

一、直接暴力两层for循环,每次更新数组A之后遍历求解所有偶数之和。

二、对于查询数组,每次只是修改A数组的一个值,可以使用一个集合记录开始A中偶数的索引,当修改A数组时,当增加的数为奇数,指定索引在集合中进行删除,指定索引不在集合中则加入到集合中

vector<int> sumEvenAfterQueries(vector<int>& A, vector<vector<int>>& queries) {
        vector<int> res;
        set<int> indexs;
        set<int>::iterator it;
        for(int i=0;i<A.size();i++){
            if(A[i] % 2 == 0) indexs.insert(i);
        }
        for(int i=0;i<queries.size();i++){
            int tmp = queries[i][0];
            int index = queries[i][1];
            it = indexs.find(index);
            if(tmp % 2 != 0){
                if(it == indexs.end()) indexs.insert(index);
                else indexs.erase(index);
            }
            A[index] += tmp;
            tmp = 0;
            for(it = indexs.begin();it != indexs.end();it++) tmp += A[*it];
            res.push_back(tmp);
        }
        return res;

三、操作数组中的某一个元素A[index]的时候,数组A其他位置的元素都应该保持不变。如果A[index]是偶数,要增加的值是偶数则S加上它,否则减去A[index];如果A[index]是奇数,要增加的数也是奇数,则S加上A[index]和val

vector<int> sumEvenAfterQueries(vector<int>& A, vector<vector<int>>& queries) {
        vector<int> res;
        int sum = 0;
        for(int i=0;i<A.size();i++) if(A[i] % 2 == 0) sum += A[i];
        for(int i=0;i<queries.size();i++){
            int val = queries[i][0];
            int index = queries[i][1];
            if(A[index] % 2 == 0){
                if(val % 2 == 0) sum += val;
                else sum -= A[index];
            }else{
                if(val % 2 != 0){
                    int t = val + A[index];
                    sum += t;
                } 
            }
            res.push_back(sum);
            A[index] += val;
        }
        return res;
    }

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值