首页 > 其他分享 >集合排列、分割

集合排列、分割

时间:2023-05-21 12:33:39浏览次数:71  
标签:分割 排列 cur nums pos back vector result 集合

目录

1. 全排列(去重)

void dfs(const vector<int>& nums, int pos, vector<vector<int>>& result, vector<int>& cur) {
    if (pos == nums.size()) {
        result.push_back(cur);
        return;
    }

    for (int i = 0; i < nums.size(); ++i) {
        // 当上一位释放的数字和这一位数字相同时,会产生相同的排列
        if (Visited[i] || (i > 0 && nums[i] == nums[i - 1] && !Visited[i - 1])) {
            continue;
        }
        Visited[i] = true;
        cur.push_back(nums[i]);
        dfs(nums, pos + 1, result, cur);
        cur.pop_back();
        Visited[i] = false;
    }
}

vector<vector<int>> permuteUnique(vector<int>& nums) {
    vector<vector<int>> result;
    vector<int> cur;
    // 全排列去重前提,排序后的数组
    sort(nums.begin(), nums.end());
    dfs(nums, 0, result, cur);
    return result;
}

2. 子集

void subset(const vector<int>& nums, int n, vector<vector<int>>& result, vector<int>& tmp) {
    if (n < 0) {
        result.push_back(tmp);
        return;
    }

    tmp.push_back(nums[n]);
    subset(nums, n - 1, result, tmp);
    tmp.pop_back();
    subset(nums, n - 1, result, tmp);
}

3. 集合分割

void segment(string n, int pos, vector<vector<string>>& res, vector<string>& cur) {
    if (pos == n.size()) {
        res.push_back(cur);
        return;
    }

    for (int i = pos; i < n.size(); ++i) {
        string s;
        for (int j = pos; j <= i; ++j) {
            s += n[j];
        }
        cur.push_back(s);
        segment(n, i + 1, res, cur);
        cur.pop_back();
    }
}

标签:分割,排列,cur,nums,pos,back,vector,result,集合
From: https://www.cnblogs.com/linukey/p/17418446.html

相关文章

  • Set集合
    set集合一直以来,JS只能使用数组和对象来保存多个数据,缺乏像其他语言那样拥有丰富的集合类型。因此,ES6新增了两种集合类型(set和map),用于在不同的场景中发挥作用。set用于存放不重复的数据如何创建set集合newSet();//创建一个没有任何内容的set集合newSet(iterable);......
  • 标准库中的生成器函数——用于重新排列元素的生成器函数
         1注意,itertools.groupby假定输入的可迭代对象要使用分组标准排序;即使不排序,至少也要使用指定的标准分组各个元素。  1#itertools.groupby函数的用法2importitertools3456k1=list(itertools.groupby('LLLLAAGGG'))7print('k1:',k......
  • 语义分割评价指标计算
    评价指标的计算代码,需要注意传入路径需要加上后缀,下面示例为计算255*255的影像 1importnumpyasnp2importglob3importtqdm4fromPILimportImage5importcv2ascv6importos7fromsklearn.metricsimportconfusion_matrix,cohen_kappa_scor......
  • 全排列去重
    全排列去重的前提要求是目标集合必须是经过排序的。在目标集合排序的前提下,第i位变换数字前后,如果是相同的数字,就会产生重复的排列。注意:第i位变换的意思是i位本身的变换,而不是i与i-1的比较。题目链接代码如下:voiddfs(constvector<int>&nums,intpos,vector<vector<int>......
  • 洛谷 P9248 - [集训队互测 2018] 完美的集合
    显然,如果选择的\(k\)个“合法集合”固定了,那么可以放置装置的点如果存在,那么必然形成一个连通块,也就是说,答案等于所有合法方案中,可以放置装置的点形成的连通块个数之和。而根据点减边的套路,这等价于,枚举每个点,计算有多少种方案满足可以在其放置装置,再枚举每条边,计算有多少种方案......
  • 十一、集合
    集合集合:集合就是个容器,用来装东西集合容器的特点1.集合容器的长度是可以变化的2.集合容器只能存储引用数据类型3.一个集合容器中可以存储不同引用数据类型的数据集合容器和数组容器的区别1.集合容器的长度是可以变化的,数组容器一旦初始化长度就不能改变了2.集合容器只能存......
  • C# 集合
    简介集合表示一组具有某种性质的数学元素,引用到程序设计中表示一组具有相同性质的对象。集合的大小可以动态调整,也可以在运行时添加或删除元素官方文档System.Collections数组集合泛型集合Concurrent线程安全集合System.Collections.Specialized集合基类接口ICollect......
  • web安全为主的网页集合
    xrayGitHub-chaitin/xray:一款完善的安全评估工具,支持常见web安全问题扫描和自定义poc|使用之前务必先阅读文档vulhubVulhub-Docker-Composefileforvulnerabilityenvironment ......
  • Hilbert 曲线与集合势理论
    1空间填充曲线1.1曲线(我们所讨论的)曲线:定义域为[0,1]的连续映射.1.2空间填充曲线(我们所讨论的)空间填充曲线的定义:连续满射f:[0,1]→[0,1]2.2Hilbert曲线2.1n阶伪Hilbert曲线Hn(t)理解一:将[0,1]2等分成2n×2n个小方块,按特定顺序将每个小方块的中心点......
  • List集合分组(大List分割成多个小List)
    1.问题来源有的时候我们需要将一个大的List集合分割成多个小的List集合以便进行操作。比如批量查询、新增、或者删除的时候,如果数量太大,可能会导致诸如sql语句过长、执行缓慢等问题。这个时候我们需要将一个大的List集合分割成多个小的List集合以便分开操作,可以有效提升执行效率。2......