Welcome to Subscribe On Youtube
3351. Sum of Good Subsequences
Description
You are given an integer array nums
. A good subsequence is defined as a subsequence of nums
where the absolute difference between any two consecutive elements in the subsequence is exactly 1.
Return the sum of all possible good subsequences of nums
.
Since the answer may be very large, return it modulo 109 + 7
.
Note that a subsequence of size 1 is considered good by definition.
Example 1:
Input: nums = [1,2,1]
Output: 14
Explanation:
- Good subsequences are:
[1]
,[2]
,[1]
,[1,2]
,[2,1]
,[1,2,1]
. - The sum of elements in these subsequences is 14.
Example 2:
Input: nums = [3,4,5]
Output: 40
Explanation:
- Good subsequences are:
[3]
,[4]
,[5]
,[3,4]
,[4,5]
,[3,4,5]
. - The sum of elements in these subsequences is 40.
Constraints:
1 <= nums.length <= 105
0 <= nums[i] <= 105
Solutions
Solution 1
-
class Solution { public int sumOfGoodSubsequences(int[] nums) { final int mod = (int) 1e9 + 7; int mx = 0; for (int x : nums) { mx = Math.max(mx, x); } long[] f = new long[mx + 1]; long[] g = new long[mx + 1]; for (int x : nums) { f[x] += x; g[x] += 1; if (x > 0) { f[x] = (f[x] + f[x - 1] + g[x - 1] * x % mod) % mod; g[x] = (g[x] + g[x - 1]) % mod; } if (x + 1 <= mx) { f[x] = (f[x] + f[x + 1] + g[x + 1] * x % mod) % mod; g[x] = (g[x] + g[x + 1]) % mod; } } long ans = 0; for (long x : f) { ans = (ans + x) % mod; } return (int) ans; } }
-
class Solution { public: int sumOfGoodSubsequences(vector<int>& nums) { const int mod = 1e9 + 7; int mx = ranges::max(nums); vector<long long> f(mx + 1), g(mx + 1); for (int x : nums) { f[x] += x; g[x] += 1; if (x > 0) { f[x] = (f[x] + f[x - 1] + g[x - 1] * x % mod) % mod; g[x] = (g[x] + g[x - 1]) % mod; } if (x + 1 <= mx) { f[x] = (f[x] + f[x + 1] + g[x + 1] * x % mod) % mod; g[x] = (g[x] + g[x + 1]) % mod; } } return accumulate(f.begin(), f.end(), 0LL) % mod; } };
-
class Solution: def sumOfGoodSubsequences(self, nums: List[int]) -> int: mod = 10**9 + 7 f = defaultdict(int) g = defaultdict(int) for x in nums: f[x] += x g[x] += 1 f[x] += f[x - 1] + g[x - 1] * x g[x] += g[x - 1] f[x] += f[x + 1] + g[x + 1] * x g[x] += g[x + 1] return sum(f.values()) % mod
-
func sumOfGoodSubsequences(nums []int) (ans int) { mod := int(1e9 + 7) mx := slices.Max(nums) f := make([]int, mx+1) g := make([]int, mx+1) for _, x := range nums { f[x] += x g[x] += 1 if x > 0 { f[x] = (f[x] + f[x-1] + g[x-1]*x%mod) % mod g[x] = (g[x] + g[x-1]) % mod } if x+1 <= mx { f[x] = (f[x] + f[x+1] + g[x+1]*x%mod) % mod g[x] = (g[x] + g[x+1]) % mod } } for _, x := range f { ans = (ans + x) % mod } return }
-
function sumOfGoodSubsequences(nums: number[]): number { const mod = 10 ** 9 + 7; const mx = Math.max(...nums); const f: number[] = Array(mx + 1).fill(0); const g: number[] = Array(mx + 1).fill(0); for (const x of nums) { f[x] += x; g[x] += 1; if (x > 0) { f[x] = (f[x] + f[x - 1] + ((g[x - 1] * x) % mod)) % mod; g[x] = (g[x] + g[x - 1]) % mod; } if (x + 1 <= mx) { f[x] = (f[x] + f[x + 1] + ((g[x + 1] * x) % mod)) % mod; g[x] = (g[x] + g[x + 1]) % mod; } } return f.reduce((acc, cur) => (acc + cur) % mod, 0); }