
2025-11-24:统计计算机解锁顺序排列数。用go语言,给定长度为 n 的数组 complexity,表示编号为 0 到 n-1 的 n 台计算机各自密码的复杂度(且复杂度两两不同)。
编号为 0 的计算机一开始已处于解锁状态,作为起点。
其余每台计算机 i 只能在此前已经解锁过某台编号为 j 的计算机的情况下被解开,且该 j 必须满足两点:j < i 且 complexity[j] < complexity[i](索引和复杂度都比 i 小)。
现在要求统计有多少种由 0..n-1 全排列形成的顺序能对应一种合法的解锁过程(即在排列中,每出现的计算机 i 之前,必然已经出现过至少一个满足上述条件的 j)。
结果对 1000000007 取模返回。
注意:编号为 0 的计算机一开始就是解锁的,这并不等同于它在排列中必须位于首位。
2 <= complexity.length <= 100000。
1 <= complexity[i] <= 1000000000。
输入: 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]。
题目来自力扣3577。
.
package main
import (
"fmt"
)
func countPermutations(complexity []int)int {
const mod = 1_000_000_007
ans := 1
for i := 1; i < len(complexity); i++ {
if complexity[i] <= complexity[0] {
return0
}
ans = ans * i % mod
}
return ans
}
func main() {
complexity := []int{1, 2, 3}
result := countPermutations(complexity)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
def count_permutations(complexity):
mod = 1_000_000_007
ans = 1
for i in range(1, len(complexity)):
if complexity[i] <= complexity[0]:
return0
ans = (ans * i) % mod
return ans
def main():
complexity = [1, 2, 3]
result = count_permutations(complexity)
print(result)
if __name__ == "__main__":
main()
.
#include <iostream>
#include <vector>
using namespace std;
int countPermutations(vector<int>& complexity) {
const int mod = 1'000'000'007;
int ans = 1;
for (int i = 1; i < complexity.size(); i++) {
if (complexity[i] <= complexity[0]) {
return 0;
}
ans = (1LL * ans * i) % mod;
}
return ans;
}
int main() {
vector<int> complexity = {1, 2, 3};
int result = countPermutations(complexity);
cout << result << endl;
return 0;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。