leetcode 排列组合系列

排列组合是回溯算法的经典问题,有固定的模板写法,包括重复元素以及非重复元素。下面总结一下leetcode中的排列组合问题。

排列
排列问题一般是对原数组进行交换,然后维护一个全局变量的结果集合,每当符合要求将当前状态下的原数组加入到结果集合之中。

题目: 46 全排列
在这里插入图片描述

    vector<vector<int>> res;
    vector<vector<int>> permute(vector<int>& nums) {
   
        backtrack(nums, 0);
        return res;

        
    }
    void backtrack(vector<int> & nums, int depth)
    {
   
        if(depth==nums.size()) res.emplace_back(nums);
        for(int i=depth;i<nums.size();i++)
        {
   
            swap(nums[i], nums[depth]);
            backtrack(nums, depth+1);
            swap(nums[i], nums[depth]);
        }
    }

注意,backtrack里面depth表示的是深度,需要不断加1

题目:47全排列 ||
在这里插入图片描述
包含重复元素的序列,需要返回不重复的全排列,如果不从结果出发(使用一个set<vector >保存),需要保证在每一层交换时,不能有两个重复元素别交换到头位置。

    vector<vector<int>> res;
    vector<vector<int>> permuteUnique(vector<int>& nums) {
   
        // sort(nums.begin(), nums.end());
        backtrack(nums, 0);
        return res;
    }
    void backtrack(vector<int> & nums, int index)
    {
   
        if(index==nums.size()){
   
            res.push_back(nums); return ;
        } 
        // 去除重复的关键在于同一深度不能有相同的元素
        unordered_set <int> record;
        
        for(int i = index;i<nums.size();i++)
        {
   
            // cout << "test " << index << " " << i << endl;
            // 因为换完顺序之后 不能保证index之后的元素其顺序性   如果使用这种不能交换元素
            // for(int j=0;j<nums.size();j++) cout << nums[j] << " ";
            // if(i>index && nums[i]==nums[i-1]) continue;
            
            if(record.find(nums[i])!=record.end()) continue; 
            record.insert(nums[i]);
            swap(nums[i], nums[index]);
            
            backtrack(nums, index+1);
            swap(nums[i], nums[index]);

            
            
        }
    }

组合
组合问题与排列问题不同,原数组是不能进行删除操作的,需要手动维护一个当前结果的序列(一般使用vector),然后每个元素都有添加与不添加两种选择。

这里的depth表示选择哪个元素 不再表示深度

在这里插入图片描述经典的组合问题, 无重复元素,不重复解。
需要注意的是数字可以无限制被选取。

无重复元素意味着不需要对每个选择的元素进行判断

无限制选取意味着下一次还可以从当前元素选起


                
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode 是一个常用的编程学习和面试准备平台,而人工智能 (AI) 处理器组合指的是在处理 LeetCode 题目时,使用多个不同类型的 AI 处理器来提高算法性能和效率。 首先,AI 处理器是具有强大计算能力和优化算法的专用芯片。与传统的通用处理器相比,AI 处理器在处理大量数据和复杂计算任务时表现更佳。 AI 处理器组合意味着将不同类型的 AI 处理器结合使用,以便在编程和解决 LeetCode 题目时获得更好的性能。这些处理器可以包括图像处理单元 (GPU),张量处理单元 (TPU),以及专门针对特定AI应用开发的ASIC等。 在处理 LeetCode 题目时,AI 处理器组合可以带来多个好处。首先,AI 处理器具有并行计算能力,能够同时处理多个任务,从而加快算法的执行速度。其次,AI 处理器通过优化算法和模型,可以提高解题的准确性和效率。例如,对于一些图像和语音处理相关的题目,使用 GPU 或 TPU 可以加速图像和声音的处理,从而更快地得到正确答案。 另外,AI 处理器组合还可以提供更多的资源和内存,以支持处理大规模数据和复杂问题。这对于一些需要使用深度学习或机器学习算法的题目非常重要,因为这些算法通常需要更多的计算资源和存储空间。 综上所述,AI 处理器组合对于处理 LeetCode 题目具有巨大的潜力。它可以加快算法的执行速度,提高解题的准确性和效率,并支持处理大规模数据和复杂问题。然而,组合不同类型的 AI 处理器需要适当的编程技巧和技术知识,以便充分发挥它们的优势和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值