2023-12-30:用go语言,给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正整数,

如果 nums 的一个排列满足以下条件,我们称它是一个特别的排列。

对于 0 <= i < n - 1 的下标 i:

要么 nums[i] % nums[i+1] == 0,

要么 nums[i+1] % nums[i] == 0。

请你返回特别排列的总数目,由于答案可能很大,请将它对 1000000007 取余 后返回。

输入:nums = [2,3,6]。

输出:2。

来自力扣2741. 特别的排列。

答案2023-12-30:

来自左程云

灵捷3.5

大体步骤如下:

1.在main函数中,我们调用了specialPerm函数,并传入nums数组。在这个函数内部,首先计算了nums数组的长度n,然后初始化了一个二维数组dp,用于记录状态的转移。

2.specialPerm函数返回调用process函数的结果,传入了nums、n、0、0和dp作为参数。

3.process函数用于计算满足特殊条件的排列总数。首先,它检查dp数组中是否已经计算了当前状态s和位置p的结果,如果是,则直接返回该结果。

4.接下来,如果状态s表示所有的数字都被使用过,那么将结果设为1,表示找到了一个满足条件的排列。

5.否则,对于给定位置p,遍历每个数字i,如果当前状态s中没有包含数字i,且a[p]能整除a[i]或者a[i]能整除a[p],则递归调用process函数,并将结果加到ans上。

6.最后,将得到的ans存入dp数组中,并返回结果。

整体的时间复杂度:O(n*2^n),其中n是nums数组的长度。对于process函数中的每个状态s以及位置p,最坏情况下都要回溯所有的n个数字,因此是指数级的复杂度。

额外空间复杂度:O(2^n * n),其中dp数组占据了主要的空间,它是一个大小为2^n * n的二维数组。

go完整代码如下:

package main

import "fmt"

var mod = 1000000007

func specialPerm(nums []int) int {
n := len(nums)
dp := make([][]int, 1<<n)
for i := range dp {
dp[i] = make([]int, n)
for j := range dp[i] {
dp[i][j] = -1
}
}
return process(nums, n, 0, 0, dp)
} func process(a []int, n, s, p int, dp [][]int) int {
if dp[s][p] != -1 {
return dp[s][p]
}
var ans int
if s == (1<<n)-1 {
ans = 1
} else {
for i := 0; i < n; i++ {
if s == 0 || (s&(1<<i) == 0 && (a[p]%a[i] == 0 || a[i]%a[p] == 0)) {
ans = (ans + process(a, n, s|(1<<i), i, dp)) % mod
}
}
}
dp[s][p] = ans
return ans
} func main() {
nums := []int{2, 3, 6}
result := specialPerm(nums)
fmt.Println("Result:", result)
}

rust完整代码如下:

fn special_perm(nums: Vec<i32>) -> i32 {
let n = nums.len();
let mod_num = 1000000007;
let mut dp = vec![vec![-1; n]; 1 << n];
process(&nums, n, 0, 0, &mut dp, mod_num)
} fn process(a: &Vec<i32>, n: usize, s: usize, p: usize, dp: &mut Vec<Vec<i32>>, mod_num: i32) -> i32 {
if dp[s][p] != -1 {
return dp[s][p];
}
let ans: i32;
if s == (1 << n) - 1 {
ans = 1;
} else {
ans = (0..n).fold(0, |accum, i| {
if s == 0 || (s & (1 << i) == 0 && (a[p] % a[i] == 0 || a[i] % a[p] == 0)) {
(accum + process(a, n, s | (1 << i), i, dp, mod_num)) % mod_num
} else {
accum
}
});
}
dp[s][p] = ans;
ans
} fn main() {
let nums = vec![2, 3, 6];
let result = special_perm(nums);
println!("Result: {}", result);
}

c++完整代码如下:

#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std; const int mod = 1000000007; int process(const vector<int>& a, int n, int s, int p, unordered_map<int, unordered_map<int, int>>& dp) {
if (dp.count(s) && dp[s].count(p) != 0) {
return dp[s][p];
}
int ans = 0;
if (s == (1 << n) - 1) {
ans = 1;
}
else {
for (int i = 0; i < n; i++) {
if (s == 0 || (s & (1 << i)) == 0 && (a[p] % a[i] == 0 || a[i] % a[p] == 0)) {
ans = (ans + process(a, n, s | (1 << i), i, dp)) % mod;
}
}
}
dp[s][p] = ans;
return ans;
} int specialPerm(const vector<int>& nums) {
int n = nums.size();
unordered_map<int, unordered_map<int, int>> dp;
return process(nums, n, 0, 0, dp);
} int main() {
vector<int> nums = { 2, 3, 6 };
int result = specialPerm(nums);
cout << "Result: " << result << endl;
return 0;
}

c完整代码如下:

#include <stdio.h>
#include <stdlib.h> #define MOD 1000000007 int process(int* a, int n, int s, int p, int** dp); int specialPerm(int* nums, int numsSize) {
int n = numsSize;
int** dp = (int**)malloc((1 << n) * sizeof(int*));
for (int i = 0; i < (1 << n); i++) {
dp[i] = (int*)malloc(n * sizeof(int));
for (int j = 0; j < n; j++) {
dp[i][j] = -1;
}
}
return process(nums, n, 0, 0, dp);
} int process(int* a, int n, int s, int p, int** dp) {
if (dp[s][p] != -1) {
return dp[s][p];
}
int ans = 0;
if (s == (1 << n) - 1) {
ans = 1;
}
else {
for (int i = 0; i < n; i++) {
if (s == 0 || ((s & (1 << i)) == 0 && (a[p] % a[i] == 0 || a[i] % a[p] == 0))) {
ans = (ans + process(a, n, s | (1 << i), i, dp)) % MOD;
}
}
}
dp[s][p] = ans;
return ans;
} int main() {
int nums[] = { 2, 3, 6 };
int result = specialPerm(nums, sizeof(nums) / sizeof(nums[0]));
printf("Result: %d\n", result); return 0;
}

2023-12-30:用go语言,给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正整数, 如果 nums 的一个排列满足以下条件,我们称它是一个特别的排列。 对于 0 <的更多相关文章

  1. 程序员之--C语言细节13(二维数组和指针,&amp;*a[i][0]的理解,数组1[e]和e[1]非常可能你没见过)

    主要内容:二维数组和指针.&*a[i][0]的理解.数组1[e]和e[1] #include <stdio.h> #define NUM_ROWS 10 #define NUM_C ...

  2. PAT 甲级 1144 The Missing Number (20 分)(简单,最后一个测试点没过由于开的数组没必要大于N)

    1144 The Missing Number (20 分)   Given N integers, you are supposed to find the smallest positive in ...

  3. 12天学好C语言——记录我的C语言学习之路(Day 10)

    12天学好C语言--记录我的C语言学习之路 Day 10: 接着昨天的指针部分学习,有这么一个题目: //还是四个学生,四门成绩,只要有学生一门功课没及格就输出这个学生的所有成绩 /*//progra ...

  4. 12天学好C语言——记录我的C语言学习之路(Day 8)

    12天学好C语言--记录我的C语言学习之路 Day 8: 从今天开始,我们获得了C语言中很有力的一个工具,那就是函数.函数的魅力不仅于此,一个程序到最后都是由众多函数组成的,我们一定要用好函数,用熟练 ...

  5. 12天学好C语言——记录我的C语言学习之路(Day 4)

    12天学好C语言--记录我的C语言学习之路 Day 4: 首先来看一段程序: //输出下面4*5的矩阵 /* 1  2  3   4   5 2  4  6   8   10 3  6  9   12 ...

  6. 12天学好C语言——记录我的C语言学习之路(Day 3)

    12天学好C语言--记录我的C语言学习之路 Day 3: 不知不觉到了第三天的学习,我们前两天学习的东西很杂乱,各个方面都有学习.我觉得这不是不系统,也不是学的不扎实,这种学习对于初学者而言我认为是很 ...

  7. 12天学好C语言——记录我的C语言学习之路(Day 2)

    12天学好C语言--记录我的C语言学习之路 Day 2: 我建议大家每一天学习之前都仅凭记忆去敲前一天敲过的最后一个程序,或者敲前一天你认为最难最长的一个程序,如果一晚上的睡眠之后不看书还能敲的出来, ...

  8. 2015.12.29~2015.12.30真题回顾!-- HTML5学堂

    2015.12.29~2015.12.30真题回顾!-- HTML5学堂 吃饭,能够解决饥饿,提供身体运作机能.练习就像吃饭,强壮自己,提升编程技能,寻求编程技巧的最佳捷径!吃饭不能停,练习同样不能停 ...

  9. 你可能不知道的30个Python语言的特点技巧

    1 介绍 从我开始学习Python时我就决定维护一个经常使用的“窍门”列表.不论何时当我看到一段让我觉得“酷,这样也行!”的代码时(在一个例子中.在StackOverflow.在开源码软件中,等等), ...

  10. 12天学好C语言——记录我的C语言学习之路(Day 12)

    12天学好C语言--记录我的C语言学习之路 Day 12: 进入最后一天的学习,用这样一个程序来综合考量指针和字符串的关系,写完这个程序,你对字符串和指针的理解应该就不错了. //输入一个字符串,内有 ...

随机推荐

  1. docker bridge网络类型研究

    bridge模式是docker的默认网络模式,使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能.可以使用iptables -t nat -vnL ...

  2. xftp 7必须更新最新版本怎么解决

    下载可以查看16进制的软件: Sublime Text 运行XFTP7 双击打开是:这样的 解决方案 用Sublime Text进行打开nslicense.dll, 打开之后查找"0f88 ...

  3. CSE 2023 混合年度回声周末

    CSE 2023 混合年度回声周末(2023 年 4 月 13 日至 15 日)25 周年银周年纪念版 近 900 名参与者参加.又是成功的伟大一年.明年 2024 年 4 月在多伦多见.敬请关注全年 ...

  4. .NET周刊【10月第1期 2023-10-01】

    国内文章 .NET应用如何防止被反编译 https://www.cnblogs.com/Can-daydayup/p/17736700.html 本文主要讲述了如何防止.NET应用被反编译.虽然无法完 ...

  5. CF431C

    题目简化和分析: k叉树,乍一看好像是树论,但我们通过分析条件,发现它每个阶段要做的事情一样,皆为:\(1\sim k\) 中选数字,这就很明显是DP. \(\mathit{f}_{i,0}\) 表示 ...

  6. 【数字图像处理】Matlab实现-图像增强-灰度图像增强

    灰度图像增强的大致原理以及操作方法 面向作业编程 上图是大概对灰度图的增强处理 就是想让图片变得更好看 那么如何具体操作就看下面的代码了 这是一个简单的线性分段处理,相信在注释的帮助下应该能看懂. % ...

  7. 什么是Kubernetes

    什么是Kubernetes Kubernetes 概述 1.K8S 是什么? K8S 的全称为 Kubernetes (K12345678S),PS:"嘛,写全称也太累了吧,不如整个缩写&q ...

  8. mysql 数据库索引在什么场景下会失效?实战篇

    CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT, `code` varchar(20) COLLATE utf8mb4_bin DEFAU ...

  9. source insight 中添加指定类型文件

    以下为source insight 3.X版本的设置方法: source insight 中过滤某些格式的文件. 建立source insight工程后,先暂时不要急于添加文件. 打开options- ...

  10. Newbie_calculations

    拿到这道题是个应用程序,经过上次的经验就跟程序交互了一下,结果根本交互不了,输入什么东西都没有反应 然后打开ida分析发现有几个函数还有一堆的操作数,看到这一堆东西就没心思分析了,后面才知道原来就是要 ...