leetcode 3577. 统计计算机解锁顺序排列数 中等

给你一个长度为 n 的数组 complexity

在房间里有 n上锁的 计算机,这些计算机的编号为 0 到 n - 1,每台计算机都有一个 唯一 的密码。编号为 i 的计算机的密码复杂度为 complexity[i]

编号为 0 的计算机密码已经 解锁,并作为根节点。其他所有计算机必须通过它或其他已经解锁的计算机来解锁,具体规则如下:

  • 可以使用编号为 j 的计算机的密码解锁编号为 i 的计算机,其中 j 是任何小于 i 的整数,且满足 complexity[j] < complexity[i](即 j < i 并且 complexity[j] < complexity[i])。
  • 要解锁编号为 i 的计算机,你需要事先解锁一个编号为 j 的计算机,满足 j < i 并且 complexity[j] < complexity[i]

求共有多少种 [0, 1, 2, ..., (n - 1)] 的排列方式,能够表示从编号为 0 的计算机(唯一初始解锁的计算机)开始解锁所有计算机的有效顺序。

由于答案可能很大,返回结果需要对 10^9 + 7 取余数。

注意: 编号为 0 的计算机的密码已解锁,而 不是排列中第一个位置的计算机密码已解锁。

排列是一个数组中所有元素的重新排列。

示例 1:

输入: complexity = 1,2,3

输出: 2

解释:

有效的排列有:

  • 0, 1, 2

    • 首先使用根密码解锁计算机 0。
    • 使用计算机 0 的密码解锁计算机 1,因为 complexity[0] < complexity[1]
    • 使用计算机 1 的密码解锁计算机 2,因为 complexity[1] < complexity[2]
  • 0, 2, 1

    • 首先使用根密码解锁计算机 0。
    • 使用计算机 0 的密码解锁计算机 2,因为 complexity[0] < complexity[2]
    • 使用计算机 0 的密码解锁计算机 1,因为 complexity[0] < complexity[1]

示例 2:

输入: complexity = 3,3,3,4,4,4

输出: 0

解释:

没有任何排列能够解锁所有计算机。

提示:

  • 2 <= complexity.length <= 10^5
  • 1 <= complexity[i] <= 10^9

分析:由题意可知,编号为 i 的计算机如果能被解锁,则一定存在一台编号小于 i 的计算机 j,它的密码复杂度 complexityj < complexityi。这个大小关系可以一直递推下去,最终所有能解锁的计算机,它们的密码复杂度一定都大于第 0 台计算机。

因此如果所有的计算机都能被解锁,则它们一定都能被第 0 台计算机解锁,排列的数量就是 n!

如果存在某台计算机的密码复杂度大于第 0 台计算机,则它一定不能被解锁,此时的答案为 0.

cpp 复制代码
int countPermutations(int* complexity, int complexitySize) {
    long long ans=0,mod=1e9+7,sum=1;
    for(int i=1;i<complexitySize;++i)
    {
        if(complexity[i]>complexity[0])sum=sum*i%mod;
        else return 0;
    }
    return sum%mod;
}
相关推荐
To_OC3 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
闪电悠米14 小时前
力扣hot100-73.矩阵置零-标记数组详解
算法·leetcode·矩阵
过期动态17 小时前
【LeetCode 热题 100】找到字符串中所有字母异位词
java·数据结构·算法·leetcode·职场和发展·rabbitmq
Adios7941 天前
设置交集大小至少为2
数据结构·算法·leetcode
程序猿乐锅1 天前
【数据结构与算法 | 第六篇】力扣1109,1094差分数组
java·算法·leetcode
hold?fish:palm2 天前
9 找到字符串中所有字母异位词
c++·算法·leetcode
Sw1zzle2 天前
算法入门(六):贪心算法 - 基础入门(Leetcode 121/455/860/376/738)
算法·leetcode·贪心算法
青山木2 天前
Hot 100 --- 岛屿数量
java·数据结构·算法·leetcode·深度优先·广度优先
啦啦啦啦啦zzzz2 天前
算法:回溯算法
c++·算法·leetcode
小肝一下2 天前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra