列表

详情


1955. 统计特殊子序列的数目

特殊序列 是由 正整数 个 0 ,紧接着 正整数 个 1 ,最后 正整数 个 2 组成的序列。

给你一个数组 nums ( 包含整数 01 和 2),请你返回 不同特殊子序列的数目 。由于答案可能很大,请你将它对 109 + 7 取余 后返回。

一个数组的 子序列 是从原数组中删除零个或者若干个元素后,剩下元素不改变顺序得到的序列。如果两个子序列的 下标集合 不同,那么这两个子序列是 不同的 。

 

示例 1:

输入:nums = [0,1,2,2]
输出:3
解释:特殊子序列为 [0,1,2,2],[0,1,2,2] 和 [0,1,2,2] 。

示例 2:

输入:nums = [2,2,0,0]
输出:0
解释:数组 [2,2,0,0] 中没有特殊子序列。

示例 3:

输入:nums = [0,1,2,0,1,2]
输出:7
解释:特殊子序列包括:
- [0,1,2,0,1,2]
- [0,1,2,0,1,2]
- [0,1,2,0,1,2]
- [0,1,2,0,1,2]
- [0,1,2,0,1,2]
- [0,1,2,0,1,2]
- [0,1,2,0,1,2]

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int countSpecialSubsequences(vector<int>& nums) { } };

java 解法, 执行用时: 13 ms, 内存消耗: 53.8 MB, 提交时间: 2023-09-27 11:04:58

class Solution {
    static int mod = 1000000007;
    
    public int countSpecialSubsequences(int[] nums) {
        int f0=0,f1=0,f2=0;
        for(int num:nums) {
            if(num == 0){
                f0 = (f0*2+1)%mod;
            }else if(num == 1){
                f1 = (f1*2%mod+f0)%mod;
            }else{
                f2 = (f2*2%mod+f1)%mod;
            }
        }
        return f2;
    }
}

cpp 解法, 执行用时: 216 ms, 内存消耗: 168.4 MB, 提交时间: 2023-09-27 11:04:42

class Solution {
private:
    static constexpr int mod = 1000000007;

public:
    int countSpecialSubsequences(vector<int>& nums) {
        int f0 = 0, f1 = 0, f2 = 0;
        for (int num: nums) {
            if (num == 0) {
                f0 = (f0 * 2 + 1) % mod;
            }
            else if (num == 1) {
                f1 = (f1 * 2 % mod + f0) % mod;
            }
            else {
                f2 = (f2 * 2 % mod + f1) % mod;
            }
        }
        return f2;
    }
};

python3 解法, 执行用时: 236 ms, 内存消耗: 20.3 MB, 提交时间: 2023-09-27 11:04:20

class Solution:
    def countSpecialSubsequences(self, nums: List[int]) -> int:
        mod = 10**9 + 7
        f0 = f1 = f2 = 0
        for num in nums:
            if num == 0:
                f0 = (f0 * 2 + 1) % mod
            elif num == 1:
                f1 = (f1 * 2 + f0) % mod
            else:
                f2 = (f2 * 2 + f1) % mod
        return f2

python3 解法, 执行用时: 356 ms, 内存消耗: 20.1 MB, 提交时间: 2023-09-27 11:03:53

class Solution:
    def countSpecialSubsequences(self, nums: List[int]) -> int:
        f = [0 for _ in range(3)]
        mod = 10 ** 9 + 7
        for v in nums:
            if v == 0:
                f[0] = (f[0]*2 + 1) % mod
            elif v == 1:
                f[1] = (f[1]*2 + f[0]) % mod
            else:
                f[2] = (f[2]*2 + f[1]) % mod
        return f[2]

golang 解法, 执行用时: 188 ms, 内存消耗: 8 MB, 提交时间: 2023-09-27 11:01:58

/**
 * f[i][0] 表示前 i 项得到的全 0 子序列个数
 * f[i][1] 表示前 i 项得到的先 0 后 1 的子序列个数
 * f[i][2] 表示前 i 项得到的特殊子序列个数
 * 
 * 结果就是f[n-1][2],
 * 实际可以压缩第一维
 */
const mod int = 1e9 + 7

func countSpecialSubsequences(nums []int) int {
	f := [3]int{}
	for _, v := range nums {
		if v == 0 {
			f[0] = (f[0]*2 + 1) % mod
		} else if v == 1 {
			f[1] = (f[1]*2 + f[0]) % mod
		} else {
			f[2] = (f[2]*2 + f[1]) % mod
		}
	}
	return f[2]
}

上一题