Skip to content

feat: add solutions to lc problem: No.0985 #4131

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 6, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 55 additions & 19 deletions solution/0900-0999/0985.Sum of Even Numbers After Queries/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,15 +59,11 @@ tags:

### 方法一:模拟

我们用一个变量 $s$ 记录数组 $nums$ 中所有偶数的和。
我们用一个整型变量 $\textit{s}$ 记录数组 $\textit{nums}$ 中所有偶数的和,初始时 $\textit{s}$ 为数组 $\textit{nums}$ 中所有偶数的和。

对于每次查询 $(v, i)$
对于每次查询 $(v, i)$,我们首先判断 $\textit{nums}[i]$ 是否为偶数,若 $\textit{nums}[i]$ 为偶数,则将 $\textit{s}$ 减去 $\textit{nums}[i]$;然后将 $\textit{nums}[i]$ 加上 $v$;若 $\textit{nums}[i]$ 为偶数,则将 $\textit{s}$ 加上 $\textit{nums}[i]$,然后将 $\textit{s}$ 加入答案数组。

我们先判断 $nums[i]$ 是否为偶数,若 $nums[i]$ 为偶数,则将 $s$ 减去 $nums[i]$;然后将 $nums[i]$ 加上 $v$;

若 $nums[i]$ 为偶数,则将 $s$ 加上 $nums[i]$,然后将 $s$ 加入答案数组。

时间复杂度 $O(n + m)$,其中 $n$ 和 $m$ 分别为数组 $nums$ 和 $queries$ 的长度。忽略答案数组的空间消耗,空间复杂度 $O(1)$。
时间复杂度 $O(n + m)$,其中 $n$ 和 $m$ 分别为数组 $\textit{nums}$ 和 $\textit{queries}$ 的长度。忽略答案数组的空间消耗,空间复杂度 $O(1)$。

<!-- tabs:start -->

Expand Down Expand Up @@ -178,12 +174,7 @@ func sumEvenAfterQueries(nums []int, queries [][]int) (ans []int) {

```ts
function sumEvenAfterQueries(nums: number[], queries: number[][]): number[] {
let s = 0;
for (const x of nums) {
if (x % 2 === 0) {
s += x;
}
}
let s = nums.reduce((acc, x) => acc + (x % 2 === 0 ? x : 0), 0);
const ans: number[] = [];
for (const [v, i] of queries) {
if (nums[i] % 2 === 0) {
Expand All @@ -199,6 +190,31 @@ function sumEvenAfterQueries(nums: number[], queries: number[][]): number[] {
}
```

#### Rust

```rust
impl Solution {
pub fn sum_even_after_queries(mut nums: Vec<i32>, queries: Vec<Vec<i32>>) -> Vec<i32> {
let mut s: i32 = nums.iter().filter(|&x| x % 2 == 0).sum();
let mut ans = Vec::with_capacity(queries.len());

for query in queries {
let (v, i) = (query[0], query[1] as usize);
if nums[i] % 2 == 0 {
s -= nums[i];
}
nums[i] += v;
if nums[i] % 2 == 0 {
s += nums[i];
}
ans.push(s);
}

ans
}
}
```

#### JavaScript

```js
Expand All @@ -208,12 +224,7 @@ function sumEvenAfterQueries(nums: number[], queries: number[][]): number[] {
* @return {number[]}
*/
var sumEvenAfterQueries = function (nums, queries) {
let s = 0;
for (const x of nums) {
if (x % 2 === 0) {
s += x;
}
}
let s = nums.reduce((acc, cur) => acc + (cur % 2 === 0 ? cur : 0), 0);
const ans = [];
for (const [v, i] of queries) {
if (nums[i] % 2 === 0) {
Expand All @@ -229,6 +240,31 @@ var sumEvenAfterQueries = function (nums, queries) {
};
```

#### C#

```cs
public class Solution {
public int[] SumEvenAfterQueries(int[] nums, int[][] queries) {
int s = nums.Where(x => x % 2 == 0).Sum();
int[] ans = new int[queries.Length];

for (int j = 0; j < queries.Length; j++) {
int v = queries[j][0], i = queries[j][1];
if (nums[i] % 2 == 0) {
s -= nums[i];
}
nums[i] += v;
if (nums[i] % 2 == 0) {
s += nums[i];
}
ans[j] = s;
}

return ans;
}
}
```

<!-- tabs:end -->

<!-- solution:end -->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,13 @@ After adding 2 to nums[3], the array is [-2,-1,3,6], and the sum of even values

<!-- solution:start -->

### Solution 1
### Solution 1: Simulation

We use an integer variable $\textit{s}$ to record the sum of all even numbers in the array $\textit{nums}$. Initially, $\textit{s}$ is the sum of all even numbers in the array $\textit{nums}$.

For each query $(v, i)$, we first check if $\textit{nums}[i]$ is even. If $\textit{nums}[i]$ is even, we subtract $\textit{nums}[i]$ from $\textit{s}$. Then, we add $v$ to $\textit{nums}[i]$. If $\textit{nums}[i]$ is even, we add $\textit{nums}[i]$ to $\textit{s}$, and then add $\textit{s}$ to the answer array.

The time complexity is $O(n + m)$, where $n$ and $m$ are the lengths of the arrays $\textit{nums}$ and $\textit{queries}$, respectively. Ignoring the space consumption of the answer array, the space complexity is $O(1)$.

<!-- tabs:start -->

Expand Down Expand Up @@ -171,12 +177,7 @@ func sumEvenAfterQueries(nums []int, queries [][]int) (ans []int) {

```ts
function sumEvenAfterQueries(nums: number[], queries: number[][]): number[] {
let s = 0;
for (const x of nums) {
if (x % 2 === 0) {
s += x;
}
}
let s = nums.reduce((acc, x) => acc + (x % 2 === 0 ? x : 0), 0);
const ans: number[] = [];
for (const [v, i] of queries) {
if (nums[i] % 2 === 0) {
Expand All @@ -192,6 +193,31 @@ function sumEvenAfterQueries(nums: number[], queries: number[][]): number[] {
}
```

#### Rust

```rust
impl Solution {
pub fn sum_even_after_queries(mut nums: Vec<i32>, queries: Vec<Vec<i32>>) -> Vec<i32> {
let mut s: i32 = nums.iter().filter(|&x| x % 2 == 0).sum();
let mut ans = Vec::with_capacity(queries.len());

for query in queries {
let (v, i) = (query[0], query[1] as usize);
if nums[i] % 2 == 0 {
s -= nums[i];
}
nums[i] += v;
if nums[i] % 2 == 0 {
s += nums[i];
}
ans.push(s);
}

ans
}
}
```

#### JavaScript

```js
Expand All @@ -201,12 +227,7 @@ function sumEvenAfterQueries(nums: number[], queries: number[][]): number[] {
* @return {number[]}
*/
var sumEvenAfterQueries = function (nums, queries) {
let s = 0;
for (const x of nums) {
if (x % 2 === 0) {
s += x;
}
}
let s = nums.reduce((acc, cur) => acc + (cur % 2 === 0 ? cur : 0), 0);
const ans = [];
for (const [v, i] of queries) {
if (nums[i] % 2 === 0) {
Expand All @@ -222,6 +243,31 @@ var sumEvenAfterQueries = function (nums, queries) {
};
```

#### C#

```cs
public class Solution {
public int[] SumEvenAfterQueries(int[] nums, int[][] queries) {
int s = nums.Where(x => x % 2 == 0).Sum();
int[] ans = new int[queries.Length];

for (int j = 0; j < queries.Length; j++) {
int v = queries[j][0], i = queries[j][1];
if (nums[i] % 2 == 0) {
s -= nums[i];
}
nums[i] += v;
if (nums[i] % 2 == 0) {
s += nums[i];
}
ans[j] = s;
}

return ans;
}
}
```

<!-- tabs:end -->

<!-- solution:end -->
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
public class Solution {
public int[] SumEvenAfterQueries(int[] nums, int[][] queries) {
int s = nums.Where(x => x % 2 == 0).Sum();
int[] ans = new int[queries.Length];

for (int j = 0; j < queries.Length; j++) {
int v = queries[j][0], i = queries[j][1];
if (nums[i] % 2 == 0) {
s -= nums[i];
}
nums[i] += v;
if (nums[i] % 2 == 0) {
s += nums[i];
}
ans[j] = s;
}

return ans;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,7 @@
* @return {number[]}
*/
var sumEvenAfterQueries = function (nums, queries) {
let s = 0;
for (const x of nums) {
if (x % 2 === 0) {
s += x;
}
}
let s = nums.reduce((acc, cur) => acc + (cur % 2 === 0 ? cur : 0), 0);
const ans = [];
for (const [v, i] of queries) {
if (nums[i] % 2 === 0) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
impl Solution {
pub fn sum_even_after_queries(mut nums: Vec<i32>, queries: Vec<Vec<i32>>) -> Vec<i32> {
let mut s: i32 = nums.iter().filter(|&x| x % 2 == 0).sum();
let mut ans = Vec::with_capacity(queries.len());

for query in queries {
let (v, i) = (query[0], query[1] as usize);
if nums[i] % 2 == 0 {
s -= nums[i];
}
nums[i] += v;
if nums[i] % 2 == 0 {
s += nums[i];
}
ans.push(s);
}

ans
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
function sumEvenAfterQueries(nums: number[], queries: number[][]): number[] {
let s = 0;
for (const x of nums) {
if (x % 2 === 0) {
s += x;
}
}
let s = nums.reduce((acc, x) => acc + (x % 2 === 0 ? x : 0), 0);
const ans: number[] = [];
for (const [v, i] of queries) {
if (nums[i] % 2 === 0) {
Expand Down