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

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

时间:2023-12-30 21:55:22浏览次数:49  
标签:排列 nums int process 数组 go dp

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;
}

在这里插入图片描述

标签:排列,nums,int,process,数组,go,dp
From: https://www.cnblogs.com/moonfdd/p/17936883

相关文章

  • 游戏AI行为决策——GOAP(目标导向型行动规划)
    游戏AI行为决策——GOAP(附代码与项目)新的一年即将到来,感觉还剩一种常见的游戏AI决策方法不讲的话,有些过意不去。就在这年的尾巴与大家一起交流下「目标导向型行为规划(GOAP)」吧!另外,我觉得只是讲代码实现而没有联系具体项目,可能还是不容易理解的。所以这次我会在文末附上一个由本......
  • Golang 不使用官方基于cgo的sqlite驱动
    参考以下的代码:packagedatabaseimport( "Forensics_Equipment_Plugin_Manager/logger" "Forensics_Equipment_Plugin_Manager/model" "github.com/glebarez/sqlite" "gorm.io/gorm")varSqliteConn*gorm.DBfuncinit(){ I......
  • Golang开发环境搭建-Vim篇
    本文于2017年3月份完成,发布在个人博客网站上。考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来。最近在研究docker的使用方法,恰好手边有一本docker源码分析的书,所以在ubuntu环境下准备了一套golang的开发环境,便于在学习docker使用的时候顺便学习gol......
  • Go - Keywords, Operators and Punctuation
     KeywordsThefollowingkeywordsarereservedandmaynotbeusedasidentifiers.breakdefaultfuncinterfaceselectcasedefergomapstructchanelsegotopackagesw......
  • django练手系列(四):制作网站的导航栏
    外观部分:一.下载Bootstrap。网站的前端样式我采用的是Bootstrapv3。Bootstrap的网址是https://www.bootcss.com/。BootstrapV3运行依赖Jquery,也需要安装Jquery。我使用的Jquery版本是Jquery-3.7.1。二.文件夹规划。1.在app下新建static文件夹,存放静态文件。2.在static下......
  • A Long read hybrid error correction algorithm based on segmented pHMM
    ALongreadhybriderrorcorrectionalgorithmbasedonsegmentedpHMM  2023/12/1511:06:36The"LongreadhybriderrorcorrectionalgorithmbasedonsegmentedpHMM"referstoaspecificapproachforerrorcorrectioninlong-readse......
  • 在 Django 中使用 Vue.js 组件的步骤如下³⁴: 1. **安装 Vue.js**:首先,你需要在你的开
    在Django中使用Vue.js组件的步骤如下³⁴:1.**安装Vue.js**:首先,你需要在你的开发环境中安装Vue.js³。2.**创建Vue组件**:在Vue.js中,你可以创建一个新的Vue组件。例如,你可以在`src/components`文件夹下新建一个名为`Home.vue`的组件¹。3.**在Django模板中引......
  • MongoDB 基础
    MongoDB是一个高性能、开源、面向文档的数据库,设计用于存储大量的数据。它使用类似于JSON的BSON格式来存储数据,这使得数据结构更加灵活,可以存储复杂的类型,如数组和嵌套文档。基本概念文档(Document):MongoDB的数据结构是基于文档的,一个文档是一个键值对的集合,类似于JSON......
  • SRE Google运维解密 10-27章
    第三部分具体实践应急事件处理一旦SRE发现了系统中存在的问题,要如何解决呢?正确的解决方案不一定是当初把问题一次性修复好,而可以靠降低系统准确度、关闭一些不重要的功能,或者将用户流量导向其他没有问题的任务实例等手段暂时缓解问题。解决方案的细节肯定是和每个服务和团队相......
  • SRE Google运维解密 28-34章
    第四部分管理第二十八章迅速培养SRE加入on-call如何给新手带上喷气背包,同时保证老手的速度不受影响?成功的SRE团队离不开信任一一为了维持全球化服务的正常运转,我们必须信任on-call团队了解系统如何运行,可以诊断系统的异常情况,善于利用资源和寻求帮助,以及可以在压力下保......