IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> leetcode 985. Sum of Even Numbers After Queries(query之后的偶数和) -> 正文阅读

[数据结构与算法]leetcode 985. Sum of Even Numbers After Queries(query之后的偶数和)

You are given an integer array nums and an array queries where queries[i] = [vali, indexi].

For each query i, first, apply nums[indexi] = nums[indexi] + vali, then print the sum of the even values of nums.

Return an integer array answer where answer[i] is the answer to the ith query.

Example 1:

Input: nums = [1,2,3,4], queries = [[1,0],[-3,1],[-4,0],[2,3]]
Output: [8,6,2,4]
Explanation: At the beginning, the array is [1,2,3,4].
After adding 1 to nums[0], the array is [2,2,3,4], and the sum of even values is 2 + 2 + 4 = 8.
After adding -3 to nums[1], the array is [2,-1,3,4], and the sum of even values is 2 + 4 = 6.
After adding -4 to nums[0], the array is [-2,-1,3,4], and the sum of even values is -2 + 4 = 2.
After adding 2 to nums[3], the array is [-2,-1,3,6], and the sum of even values is -2 + 6 = 4.

有一个nums数组,每次query:[val, index]会产生nums[index] += val的效果。
最后要返回每次query之后nums中所有偶数的和。

思路:

每次只操作nums[index]一个数字,所以不需要每次都计算所有偶数的和,
刚开始的时候计算一次,后面每次就操作这一个数字。

这时候要分几种情况:
奇数是不会加到和里面去的,如果之前是奇数,现在是偶数,就要把现在的偶数加到和里面。
如果之前是偶数,现在是奇数,就要从现有的和里面减去之前的偶数,因为现在这个nums[index]不参与计算了。
之前是偶数,现在还是偶数,就加上差分的val部分即可。
之前奇数,现在还是奇数,都不参与计算,不需要处理。

所以这个思路整理成代码就是这样的。

public int[] sumEvenAfterQueries(int[] nums, int[][] queries) {
    int evenSum = 0;
    int[] res = new int[queries.length];
    int i = 0;
    
    for(int num : nums) {
        if(num % 2 == 0) evenSum += num;
    }
    
    for(int[] query : queries) {
        int val = query[0];
        int index = query[1];
        
        //previous odd, now even
        if(nums[index] % 2 != 0 && (nums[index]+val) % 2 == 0) evenSum += (nums[index] + val);
        //previous even, now even
        else if(nums[index] % 2 == 0 && (nums[index]+val) % 2 == 0) evenSum += val;
        //previous even, now odd
        else if(nums[index] % 2 == 0 && (nums[index]+val) % 2 != 0) evenSum -= nums[index];
        //previous odd, now odd
        //do nothing
        nums[index] += val;
        res[i++] = evenSum;
    }
    return res;
}

通过是能通过的,不过时间排名很靠后,
多次重复的计算nums[index] % 2 和 (nums[index]+val) % 2,
再整理一下,

需要处理的情况无非就是之前是(奇数,偶数),现在是(奇数,偶数)
之前是奇数时没参与计算,
之前是偶数时,把之前的偶数从和里减掉,就达到了“清零”操作。
然后看现在,
奇数不参与计算,
只需要看偶数的情况,偶数时把偶数加到和里面就好了。

同时,有个技巧,判断奇偶时,只需要判断最低的bit位是不是1.
不要忘了更新nums[index]。

public int[] sumEvenAfterQueries(int[] nums, int[][] queries) {
    int evenSum = 0;
    int[] res = new int[queries.length];
    int i = 0;
    
    for(int num : nums) {
        if(num % 2 == 0) evenSum += num;
    }
    
    for(int[] query : queries) {
        int val = query[0];
        int index = query[1];
        
        //previous even
        if((nums[index] & 1) == 0) evenSum -= nums[index];
        
        nums[index] += val;
        
        //now even
        if((nums[index] & 1) == 0) evenSum += nums[index];
        res[i++] = evenSum;
    }
    return res;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 21:19:25  更:2022-09-24 21:22:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:49:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码