给你一个长度为 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^51 <= complexity[i] <= 10^9
分析:由题意可知,编号为 i 的计算机如果能被解锁,则一定存在一台编号小于 i 的计算机 j,它的密码复杂度 complexity[j] < complexity[i]。这个大小关系可以一直递推下去,最终所有能解锁的计算机,它们的密码复杂度一定都大于第 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;
}