Files
leetcode-master/problems/kamacoder/0145.数组子序列的排列.md
programmercarl 2d9604baa5 Update
2024-07-26 11:35:38 +08:00

2.3 KiB
Raw Blame History

145. 数组子序列的排列

每个元素出现的次数相乘就可以了。

注意 “长度为 m 的数组1 到 m 每个元素都出现过,且恰好出现 1 次。” 题目中有n个元素所以我们要统计的就是 1 到 n 元素出现的个数。

因为如果有一个元素x 大于n了 那不可能出现 长度为x的数组 且 1 到 x 每个元素都出现过。

#include "bits/stdc++.h"
using namespace std;
int main(){
    int n;
    int x;
    cin >> n;
    unordered_map<int, int> umap;
    for(int i = 0; i < n; ++i){
        cin >> x;
        if(umap.find(x) != umap.end()) umap[x]++;
        else umap[x] = 1;
    }
    long long res = 0;
    long long num = 1;
    for (int i = 1; i <= n; i++) { 
        if (umap.find(i) == umap.end()) break; // 如果i都没出现后面得数也不能 1 到 m 每个元素都出现过
        num = (num * umap[i]) % 1000000007;
        res += num;
        res %= 1000000007;
    }
    cout << res << endl;
}


import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < n; i++) {
            int x = sc.nextInt();
            map.put(x, map.getOrDefault(x, 0) + 1);
        }
        long res = 0;
        long num = 1;
        for (int i = 1; i <= n; i++) {
            if (!map.containsKey(i)) break; // 如果i都没出现后面得数也不能1到m每个元素都出现过
            num = (num * map.get(i)) % 1000000007;
            res += num;
            res %= 1000000007;
        }
        System.out.println(res);
        sc.close();
    }
}
 
def main():
    import sys
    input = sys.stdin.read
    data = input().split()

    n = int(data[0])
    umap = {}

    for i in range(1, n + 1):
        x = int(data[i])
        if x in umap:
            umap[x] += 1
        else:
            umap[x] = 1

    res = 0
    num = 1
    MOD = 1000000007

    for i in range(1, n + 1):
        if i not in umap:
            break  # 如果i都没出现后面得数也不能1到m每个元素都出现过
        num = (num * umap[i]) % MOD
        res = (res + num) % MOD

    print(res)

if __name__ == "__main__":
    main()