首页 > 其他分享 >LeetCode/特别的排列

LeetCode/特别的排列

时间:2023-06-23 20:25:33浏览次数:34  
标签:pre 特别 排列 nums int memo mask LeetCode

给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正整数。如果 nums 的一个排列满足以下条件,我们称它是一个特别的排列:
对于 0 <= i < n - 1 的下标 i ,要么 nums[i] % nums[i+1] == 0 ,要么 nums[i+1] % nums[i] == 0

1. 记忆化搜索 + 状态压缩

class Solution {
public:
    int specialPerm(vector<int>& nums) {
        int mod = 1e9+7;
        int m = nums.size();
        int memo[m][m<<14];
        memset(memo, -1, sizeof(memo));
        function<int(int, int,int)> f = [&](int pre, int mask,int depth) -> int {
            if (depth==m) //边界条件一
                return 1;
            if (pre!=-1&&memo[pre][mask] != -1) //已经存储过,直接剪枝返回
                return memo[pre][mask];
            int res = 0; //计算无重复数字
            
            //做选择
            for (int j = 0; j < nums.size(); j++) //遍历数做选择
                if ((mask & 1<<j) == 0){ // j 不在 mask 中
                        if(pre==-1||nums[pre]%nums[j]==0||nums[j]%nums[pre]==0)
                            res = (res + f(j, mask | (1 << j),depth+1)%mod)%mod;
                }
            if(pre!=-1)
                memo[pre][mask] = res%mod;
            return res;
        };
        
        return f(-1, 0,0);   //从下标-1开始,初始状态为空,
    }
};

标签:pre,特别,排列,nums,int,memo,mask,LeetCode
From: https://www.cnblogs.com/929code/p/17500115.html

相关文章

  • 2023年春招必备-LeetCode刷题笔记最短最优雅经验整理分享
        本资源将根据LeetCode中文版探索板块给出的路线制作题解,各专栏将尽力覆盖各大知识要点并总结知识点和套路。相比于题库解析部分追求代码的绝对精简,本专题追求以高可读性呈现各大专题的常规思路,为后续的题库解析部分做铺垫。俩部分题目可能重复,但专题部分会有更详细的解析......
  • 做leetcode算法题的一些感受
    leetcode题目做了34道了,写下目前的感受,不一定对,需要经常修改内容。1、代码是怎么写出来的?不是一下子写出来的,是逐步填充,逐步具体的。一句话,写代码也要看到历史和现状,现状不是突然出现的,是有发展历史的。不是从1直接就到10了,而是从1->2->3,逐步递进,最后到10。写代码总要写第一行,这......
  • LeetCode--矩形走位
    59. 螺旋矩阵II定义一个总数,是所有格子走完中心的最大数,target=n*n从1开始,每走一步,当前数+1,while(curNum<=target)就继续走定义每圈螺旋走位的边界,初始值:left=0;right=n-1;top=0;bottom=n-1;1、在顶部一行从左到右走,从left走到right由于占了顶部一行......
  • leetcode 338. 比特位计数
    338.比特位计数难度简单1216给你一个整数 n ,对于 0<=i<=n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n+1 的数组 ans 作为答案。示例1:输入:n=2输出:[0,1,1]解释:0-->01-->12-->10示例2:输入:n=5输出:[0,1,1,2,1,2]解释:0-......
  • leetcode 283. 移动零
    283.移动零难度简单给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。示例1:输入:nums=[0,1,0,3,12]输出:[1,3,12,0,0]示例2:输入:nums=[0]输出:[0]提示:1<=......
  • #yyds干货盘点# LeetCode程序员面试金典:复制带随机指针的链表
    题目:给你一个长度为n的链表,每个节点包含一个额外增加的随机指针random,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由n个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的next指针和random指针也都应指向复制......
  • #yyds干货盘点# LeetCode程序员面试金典:最短回文串
    1.简述:给定一个字符串s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。 示例1:输入:s="aacecaaa"输出:"aaacecaaa"示例2:输入:s="abcd"输出:"dcbabcd"2.代码实现:classSolution{publicStringshortestPalindrome(Strings)......
  • [Leetcode] 0009. 回文数
    9.回文数点击上方,跳转至Leetcode题目描述给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121是回文,而123不是。 示例1:输入:x=121输出:true示例 2:输入:x=-121输出:false解释:......
  • [Leetcode] 0013. 罗马数字转整数
    13.罗马数字转整数点击上方,跳转至leetcode题目描述罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符数值I1V5X10L50C100D500M1000例如,罗马数字2写......
  • [Leetcode] 0014. 最长公共前缀
    14.最长公共前缀点击上方,跳转至Leetcode题目描述编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。 示例1:输入:strs=["flower","flow","flight"]输出:"fl"示例2:输入:strs=["dog","racecar","car"]输出......