From 855f5a395038b20406bcb6b4579f5353a7b08868 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Wed, 23 Aug 2023 19:03:01 +0800 Subject: [PATCH] feat: add solutions to lc problem: No.2143 No.2143.Choose Numbers From Two Arrays in Range --- .../README.md | 157 +++++++++++++++++- .../README_EN.md | 145 +++++++++++++++- .../Solution.cpp | 29 ++++ .../Solution.go | 33 ++++ .../Solution.java | 27 +++ .../Solution.py | 18 ++ .../Solution.ts | 27 +++ 7 files changed, 430 insertions(+), 6 deletions(-) create mode 100644 solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/Solution.cpp create mode 100644 solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/Solution.go create mode 100644 solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/Solution.java create mode 100644 solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/Solution.py create mode 100644 solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/Solution.ts diff --git a/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/README.md b/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/README.md index c52c02198387d..5adec6e865d85 100644 --- a/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/README.md +++ b/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/README.md @@ -71,6 +71,16 @@ +**方法一:动态规划** + +我们定义 $f[i][j]$ 表示以第 $i$ 个元素结尾,且从 $nums1$ 中选取的数字和与从 $nums2$ 中选取的数字和之差为 $j$ 的平衡区间的个数。由于差值可能为负数,因此,我们统一将 $j$ 加上 $s_2 = \sum_{k=0}^{n-1}nums2[k]$,这样就可以保证 $j$ 为非负整数。 + +考虑 $f[i][j]$,我们可以单独将第 $i$ 个元素视为一个区间,那么 $f[i][nums1[i] + s_2]$ 和 $f[i][-nums2[i] + s_2]$ 都会增加 $1$。此外,如果 $i \gt 0$,我们也可以将第 $i$ 个元素添加到前面的某个区间中,我们在 $[0, s_1 + s_2]$ 范围内枚举 $j$,如果 $j \geq a$,那么 $f[i][j]$ 会增加 $f[i - 1][j - a]$,如果 $j + b \leq s_1 + s_2$,那么 $f[i][j]$ 会增加 $f[i - 1][j + b]$。 + +答案为 $\sum_{i=0}^{n-1}f[i][s_2]$。 + +时间复杂度 $O(n \times M)$,空间复杂度 $O(n \times M)$。其中 $n$ 和 $M$ 分别为数组 $nums1$ 的长度以及数字和的最大值。 + ### **Python3** @@ -78,7 +88,24 @@ ```python - +class Solution: + def countSubranges(self, nums1: List[int], nums2: List[int]) -> int: + n = len(nums1) + s1, s2 = sum(nums1), sum(nums2) + f = [[0] * (s1 + s2 + 1) for _ in range(n)] + ans = 0 + mod = 10**9 + 7 + for i, (a, b) in enumerate(zip(nums1, nums2)): + f[i][a + s2] += 1 + f[i][-b + s2] += 1 + if i: + for j in range(s1 + s2 + 1): + if j >= a: + f[i][j] = (f[i][j] + f[i - 1][j - a]) % mod + if j + b < s1 + s2 + 1: + f[i][j] = (f[i][j] + f[i - 1][j + b]) % mod + ans = (ans + f[i][s2]) % mod + return ans ``` ### **Java** @@ -86,15 +113,137 @@ ```java +class Solution { + public int countSubranges(int[] nums1, int[] nums2) { + int n = nums1.length; + int s1 = Arrays.stream(nums1).sum(); + int s2 = Arrays.stream(nums2).sum(); + int[][] f = new int[n][s1 + s2 + 1]; + int ans = 0; + final int mod = (int) 1e9 + 7; + for (int i = 0; i < n; ++i) { + int a = nums1[i], b = nums2[i]; + f[i][a + s2]++; + f[i][-b + s2]++; + if (i > 0) { + for (int j = 0; j <= s1 + s2; ++j) { + if (j >= a) { + f[i][j] = (f[i][j] + f[i - 1][j - a]) % mod; + } + if (j + b <= s1 + s2) { + f[i][j] = (f[i][j] + f[i - 1][j + b]) % mod; + } + } + } + ans = (ans + f[i][s2]) % mod; + } + return ans; + } +} +``` +### **C++** + +```cpp +class Solution { +public: + int countSubranges(vector& nums1, vector& nums2) { + int n = nums1.size(); + int s1 = accumulate(nums1.begin(), nums1.end(), 0); + int s2 = accumulate(nums2.begin(), nums2.end(), 0); + int f[n][s1 + s2 + 1]; + memset(f, 0, sizeof(f)); + int ans = 0; + const int mod = 1e9 + 7; + for (int i = 0; i < n; ++i) { + int a = nums1[i], b = nums2[i]; + f[i][a + s2]++; + f[i][-b + s2]++; + if (i) { + for (int j = 0; j <= s1 + s2; ++j) { + if (j >= a) { + f[i][j] = (f[i][j] + f[i - 1][j - a]) % mod; + } + if (j + b <= s1 + s2) { + f[i][j] = (f[i][j] + f[i - 1][j + b]) % mod; + } + } + } + ans = (ans + f[i][s2]) % mod; + } + return ans; + } +}; ``` -### **TypeScript** +### **Go** + +```go +func countSubranges(nums1 []int, nums2 []int) (ans int) { + n := len(nums1) + s1, s2 := sum(nums1), sum(nums2) + f := make([][]int, n) + for i := range f { + f[i] = make([]int, s1+s2+1) + } + const mod int = 1e9 + 7 + for i, a := range nums1 { + b := nums2[i] + f[i][a+s2]++ + f[i][-b+s2]++ + if i > 0 { + for j := 0; j <= s1+s2; j++ { + if j >= a { + f[i][j] = (f[i][j] + f[i-1][j-a]) % mod + } + if j+b <= s1+s2 { + f[i][j] = (f[i][j] + f[i-1][j+b]) % mod + } + } + } + ans = (ans + f[i][s2]) % mod + } + return +} + +func sum(nums []int) (ans int) { + for _, x := range nums { + ans += x + } + return +} +``` - +### **TypeScript** ```ts - +function countSubranges(nums1: number[], nums2: number[]): number { + const n = nums1.length; + const s1 = nums1.reduce((a, b) => a + b, 0); + const s2 = nums2.reduce((a, b) => a + b, 0); + const f: number[][] = Array(n) + .fill(0) + .map(() => Array(s1 + s2 + 1).fill(0)); + const mod = 1e9 + 7; + let ans = 0; + for (let i = 0; i < n; ++i) { + const [a, b] = [nums1[i], nums2[i]]; + f[i][a + s2]++; + f[i][-b + s2]++; + if (i) { + for (let j = 0; j <= s1 + s2; ++j) { + if (j >= a) { + f[i][j] = (f[i][j] + f[i - 1][j - a]) % mod; + } + if (j + b <= s1 + s2) { + f[i][j] = (f[i][j] + f[i - 1][j + b]) % mod; + } + } + } + ans = (ans + f[i][s2]) % mod; + } + return ans; +} ``` ### **...** diff --git a/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/README_EN.md b/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/README_EN.md index 2c51fbde53a98..7961bcacf3f66 100644 --- a/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/README_EN.md +++ b/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/README_EN.md @@ -72,19 +72,160 @@ In the second balanced range, we choose nums2[1] and in the third balanced range ### **Python3** ```python - +class Solution: + def countSubranges(self, nums1: List[int], nums2: List[int]) -> int: + n = len(nums1) + s1, s2 = sum(nums1), sum(nums2) + f = [[0] * (s1 + s2 + 1) for _ in range(n)] + ans = 0 + mod = 10**9 + 7 + for i, (a, b) in enumerate(zip(nums1, nums2)): + f[i][a + s2] += 1 + f[i][-b + s2] += 1 + if i: + for j in range(s1 + s2 + 1): + if j >= a: + f[i][j] = (f[i][j] + f[i - 1][j - a]) % mod + if j + b < s1 + s2 + 1: + f[i][j] = (f[i][j] + f[i - 1][j + b]) % mod + ans = (ans + f[i][s2]) % mod + return ans ``` ### **Java** ```java +class Solution { + public int countSubranges(int[] nums1, int[] nums2) { + int n = nums1.length; + int s1 = Arrays.stream(nums1).sum(); + int s2 = Arrays.stream(nums2).sum(); + int[][] f = new int[n][s1 + s2 + 1]; + int ans = 0; + final int mod = (int) 1e9 + 7; + for (int i = 0; i < n; ++i) { + int a = nums1[i], b = nums2[i]; + f[i][a + s2]++; + f[i][-b + s2]++; + if (i > 0) { + for (int j = 0; j <= s1 + s2; ++j) { + if (j >= a) { + f[i][j] = (f[i][j] + f[i - 1][j - a]) % mod; + } + if (j + b <= s1 + s2) { + f[i][j] = (f[i][j] + f[i - 1][j + b]) % mod; + } + } + } + ans = (ans + f[i][s2]) % mod; + } + return ans; + } +} +``` +### **C++** + +```cpp +class Solution { +public: + int countSubranges(vector& nums1, vector& nums2) { + int n = nums1.size(); + int s1 = accumulate(nums1.begin(), nums1.end(), 0); + int s2 = accumulate(nums2.begin(), nums2.end(), 0); + int f[n][s1 + s2 + 1]; + memset(f, 0, sizeof(f)); + int ans = 0; + const int mod = 1e9 + 7; + for (int i = 0; i < n; ++i) { + int a = nums1[i], b = nums2[i]; + f[i][a + s2]++; + f[i][-b + s2]++; + if (i) { + for (int j = 0; j <= s1 + s2; ++j) { + if (j >= a) { + f[i][j] = (f[i][j] + f[i - 1][j - a]) % mod; + } + if (j + b <= s1 + s2) { + f[i][j] = (f[i][j] + f[i - 1][j + b]) % mod; + } + } + } + ans = (ans + f[i][s2]) % mod; + } + return ans; + } +}; +``` + +### **Go** + +```go +func countSubranges(nums1 []int, nums2 []int) (ans int) { + n := len(nums1) + s1, s2 := sum(nums1), sum(nums2) + f := make([][]int, n) + for i := range f { + f[i] = make([]int, s1+s2+1) + } + const mod int = 1e9 + 7 + for i, a := range nums1 { + b := nums2[i] + f[i][a+s2]++ + f[i][-b+s2]++ + if i > 0 { + for j := 0; j <= s1+s2; j++ { + if j >= a { + f[i][j] = (f[i][j] + f[i-1][j-a]) % mod + } + if j+b <= s1+s2 { + f[i][j] = (f[i][j] + f[i-1][j+b]) % mod + } + } + } + ans = (ans + f[i][s2]) % mod + } + return +} + +func sum(nums []int) (ans int) { + for _, x := range nums { + ans += x + } + return +} ``` ### **TypeScript** ```ts - +function countSubranges(nums1: number[], nums2: number[]): number { + const n = nums1.length; + const s1 = nums1.reduce((a, b) => a + b, 0); + const s2 = nums2.reduce((a, b) => a + b, 0); + const f: number[][] = Array(n) + .fill(0) + .map(() => Array(s1 + s2 + 1).fill(0)); + const mod = 1e9 + 7; + let ans = 0; + for (let i = 0; i < n; ++i) { + const [a, b] = [nums1[i], nums2[i]]; + f[i][a + s2]++; + f[i][-b + s2]++; + if (i) { + for (let j = 0; j <= s1 + s2; ++j) { + if (j >= a) { + f[i][j] = (f[i][j] + f[i - 1][j - a]) % mod; + } + if (j + b <= s1 + s2) { + f[i][j] = (f[i][j] + f[i - 1][j + b]) % mod; + } + } + } + ans = (ans + f[i][s2]) % mod; + } + return ans; +} ``` ### **...** diff --git a/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/Solution.cpp b/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/Solution.cpp new file mode 100644 index 0000000000000..2da3e66dfa06e --- /dev/null +++ b/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/Solution.cpp @@ -0,0 +1,29 @@ +class Solution { +public: + int countSubranges(vector& nums1, vector& nums2) { + int n = nums1.size(); + int s1 = accumulate(nums1.begin(), nums1.end(), 0); + int s2 = accumulate(nums2.begin(), nums2.end(), 0); + int f[n][s1 + s2 + 1]; + memset(f, 0, sizeof(f)); + int ans = 0; + const int mod = 1e9 + 7; + for (int i = 0; i < n; ++i) { + int a = nums1[i], b = nums2[i]; + f[i][a + s2]++; + f[i][-b + s2]++; + if (i) { + for (int j = 0; j <= s1 + s2; ++j) { + if (j >= a) { + f[i][j] = (f[i][j] + f[i - 1][j - a]) % mod; + } + if (j + b <= s1 + s2) { + f[i][j] = (f[i][j] + f[i - 1][j + b]) % mod; + } + } + } + ans = (ans + f[i][s2]) % mod; + } + return ans; + } +}; \ No newline at end of file diff --git a/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/Solution.go b/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/Solution.go new file mode 100644 index 0000000000000..56c8f5b78848f --- /dev/null +++ b/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/Solution.go @@ -0,0 +1,33 @@ +func countSubranges(nums1 []int, nums2 []int) (ans int) { + n := len(nums1) + s1, s2 := sum(nums1), sum(nums2) + f := make([][]int, n) + for i := range f { + f[i] = make([]int, s1+s2+1) + } + const mod int = 1e9 + 7 + for i, a := range nums1 { + b := nums2[i] + f[i][a+s2]++ + f[i][-b+s2]++ + if i > 0 { + for j := 0; j <= s1+s2; j++ { + if j >= a { + f[i][j] = (f[i][j] + f[i-1][j-a]) % mod + } + if j+b <= s1+s2 { + f[i][j] = (f[i][j] + f[i-1][j+b]) % mod + } + } + } + ans = (ans + f[i][s2]) % mod + } + return +} + +func sum(nums []int) (ans int) { + for _, x := range nums { + ans += x + } + return +} \ No newline at end of file diff --git a/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/Solution.java b/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/Solution.java new file mode 100644 index 0000000000000..6f049243a4b1c --- /dev/null +++ b/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/Solution.java @@ -0,0 +1,27 @@ +class Solution { + public int countSubranges(int[] nums1, int[] nums2) { + int n = nums1.length; + int s1 = Arrays.stream(nums1).sum(); + int s2 = Arrays.stream(nums2).sum(); + int[][] f = new int[n][s1 + s2 + 1]; + int ans = 0; + final int mod = (int) 1e9 + 7; + for (int i = 0; i < n; ++i) { + int a = nums1[i], b = nums2[i]; + f[i][a + s2]++; + f[i][-b + s2]++; + if (i > 0) { + for (int j = 0; j <= s1 + s2; ++j) { + if (j >= a) { + f[i][j] = (f[i][j] + f[i - 1][j - a]) % mod; + } + if (j + b <= s1 + s2) { + f[i][j] = (f[i][j] + f[i - 1][j + b]) % mod; + } + } + } + ans = (ans + f[i][s2]) % mod; + } + return ans; + } +} \ No newline at end of file diff --git a/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/Solution.py b/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/Solution.py new file mode 100644 index 0000000000000..a8868cdb34b67 --- /dev/null +++ b/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/Solution.py @@ -0,0 +1,18 @@ +class Solution: + def countSubranges(self, nums1: List[int], nums2: List[int]) -> int: + n = len(nums1) + s1, s2 = sum(nums1), sum(nums2) + f = [[0] * (s1 + s2 + 1) for _ in range(n)] + ans = 0 + mod = 10**9 + 7 + for i, (a, b) in enumerate(zip(nums1, nums2)): + f[i][a + s2] += 1 + f[i][-b + s2] += 1 + if i: + for j in range(s1 + s2 + 1): + if j >= a: + f[i][j] = (f[i][j] + f[i - 1][j - a]) % mod + if j + b < s1 + s2 + 1: + f[i][j] = (f[i][j] + f[i - 1][j + b]) % mod + ans = (ans + f[i][s2]) % mod + return ans diff --git a/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/Solution.ts b/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/Solution.ts new file mode 100644 index 0000000000000..edb3f13025512 --- /dev/null +++ b/solution/2100-2199/2143.Choose Numbers From Two Arrays in Range/Solution.ts @@ -0,0 +1,27 @@ +function countSubranges(nums1: number[], nums2: number[]): number { + const n = nums1.length; + const s1 = nums1.reduce((a, b) => a + b, 0); + const s2 = nums2.reduce((a, b) => a + b, 0); + const f: number[][] = Array(n) + .fill(0) + .map(() => Array(s1 + s2 + 1).fill(0)); + const mod = 1e9 + 7; + let ans = 0; + for (let i = 0; i < n; ++i) { + const [a, b] = [nums1[i], nums2[i]]; + f[i][a + s2]++; + f[i][-b + s2]++; + if (i) { + for (let j = 0; j <= s1 + s2; ++j) { + if (j >= a) { + f[i][j] = (f[i][j] + f[i - 1][j - a]) % mod; + } + if (j + b <= s1 + s2) { + f[i][j] = (f[i][j] + f[i - 1][j + b]) % mod; + } + } + } + ans = (ans + f[i][s2]) % mod; + } + return ans; +}