LintCode-17: Subsets 和 Subsets II (搜索题中的超级经典!)

技术代号“法兰西”的精准定位与工程化实践指南 在技术开发与数据工程领域,面对内部项目代号或社区昵称这类模糊的技术组件标识时,高效的定位与验证流程至关重要。其核心原理在于通过系统化的意图过滤和资源检索策略,将非标准的代号映射到具体的模型、数据集或工具实体上。这一过程的技术价值在于能显著提升开发效率,避免因信息模糊导致的重复劳动和集成风险。典型的应用场景包括处理自然语言处理中的特定语言模型、定位内部数据集,或对接代号化的微服务。本文以“法兰西”这一典型代号为例,深入剖析了从内部上下文追溯、公开平台定向搜索到环境搭建、批量处理乃至生产化封装的完整链路,为工程 阅读详情
  1. Subsets

Given a set of distinct integers, return all possible subsets.

Example
Example 1:

Input: [0]
Output:
[
[],
[0]
]
Example 2:

Input: [1,2,3]
Output:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
Challenge
Can you do it in both recursively and iteratively?

Notice
Elements in a subset must be in non-descending order.
The solution set must not contain duplicate subsets.

SubSet 这题有4种解法,其中DFS两种,BFS一种,位运算一种。
解法1:DFS组合类模板。对应每个元素都有选或不选两种可能。
输入为[1,2,3]的递归树如下图。注意,最下面一行的每个节点均为一个可行解。
在这里插入图片描述

class Solution {
public:
    /**
     * @param nums: A set of numbers
     * @return: A list of lists
     */
    vector<vector<int>> subsets(vector<int> &nums) {
        int n = nums.size();
        if (n == 0) return {{}};
        vector<vector<int>> result;
        vector<int> sol;
        sort(nums.begin(), nums.end());
        helper(nums, 0, result, sol);
        return result;
    }

private:
    void helper(vector<int> & nums, int pos, vector<vector<int>> &result, vector<int> & sol) {
        if (pos == nums.size()) {
            result.push_back(sol);
            return;
        }
        
        sol.push_back(nums[pos]);
        helper(nums, pos + 1, result, sol);
        sol.pop_back();
        helper(nums, pos + 1, result, sol);
        
        return;
    }
};

解法2:
DFS 通用回溯解法。注意!上面那个DFS没有for loop,这里的DFS有for loop!
注意:

  1. 是每次进入helper()的sol都是一个解,所以不用等到index=nums.size()再存到results里面。
  2. vector < vector < int> > results;
    results的值会是[]。如果想让它变成[[]],要用results.push_back(vector());
  3. 输入为[1,2,3]的递归树如下图。注意:其中每个节点均为一个可行解。
    由此看来,解法2只调用了DFS8次,而解法1调用了DFS15次。
    在这里插入图片描述
class Solution {
public:
    /**
     * @param nums: A set of numbers
     * @return: A list of lists
     */
    vector<vector<int>> subsets(vector<int> &nums) {
        vector<vector<int> > results;
        vector<int> sol;
        
        if (nums.empty()) {
          results.push_back(vector<int>());
          return results;
        }
        
        sort(nums.begin(), nums.end());

        helper(nums, 0, sol, results);
        return results;
    }
    
    void helper(vector<int> &nums, int index, vector<int>&sol, vector<vector<int>> &results) {
        
        results.push_back(sol);
        for (int i=index; i<nums.size(); ++i) {
            sol.push_back(nums[i]);
            helper(nums, i+1, sol, results);    //切记这里是i+1,不是index+1
            sol.pop_back();
        }
    }

};

个人的一个总结:
1. 如果有重复元素,subsets和permutation都需要先排序。
2. 如果没有重复元素, permuation不需要先排序。subsets如果输出结果的每个subset不需要按字典序排序
(也就是说(3,0,4)而不是(0,3,4)可以接受)的话,也不需要sort。否则如果输出结果的每个subset需要按字典序排序,那subsets这题就需要先排序。

二刷:

class Solution {
public:
    /**
     * @param nums: A set of numbers
     * @return: A list of lists
     *          we will sort your return value in output
     */
    vector<vector<int>> subsets(vector<int> &nums) {
        vector<vector<int>> res;
        int numsSize = nums.size();
        if (numsSize == 0) return {{}};
        sort(nums.begin(), nums.end());
        vector<int> sol;
        dfs(nums, 0, sol, res);
        return res;
    }
private:
    void dfs(vector<int> &nums, int startIndex, vector<int> &sol, vector<vector<int>> &res) {
        res.push_back(sol); 
        int numsSize = nums.size();
        for (int i = startIndex; i < numsSize; i++) {
            sol.push_back(nums[i]);
            dfs(nums, i + 1, sol, res);
            sol.pop_back();
        }
    }
};

Gemini的关于解法1和解法2的解答:
两个解法都是回溯算法(Backtracking)!在算法界,这两种写法通常被称为回溯的两种标准流派。只要代码中包含了回溯算法最核心的三个步骤:做选择(push_back)、向下递归(helper)、撤销选择(pop_back),它就属于回溯算法。它们只是在对“如何回溯”的决策树建模上产生了分歧:

解法 1:状态回溯(二叉决策树)回溯特征:它在对单个元素的状态进行回溯。
逻辑:我把 nums[pos] 放进背包(做选择),去探索后续可能性;回来后,我必须把它拿出来(撤销选择),再在不放它的情况下探索后续可能性。
形象比喻:抛硬币。每次面对一个数,你要么抛出正面(选),要么抛出反面(不选)。

解法 2:路径回溯(多叉组合树)回溯特征:它在对子集延伸的路径进行回溯。
逻辑:在这一层,我尝试把 nums[i] 作为子集的下一个元素(做选择),深入向下探索;回来后,我把它拿出来(撤销选择),以便腾出位置在下一次循环里尝试把 nums[i+1] 作为下一个元素。
形象比喻:挑衣服。你的衣柜里有几件衣服,你先试穿 A 看看效果(递归),脱下来(回溯),再试穿 B 看看效果。为什么大家更习惯把“解法 2”叫做经典回溯?虽然两者都是回溯,但在实际刷题和面试中,解法 2 的多叉树模板(带 for 循环)使用得更广泛。
原因有以下两点:更方便剪枝(去重):如果题目变成 Subsets II(数组里有重复元素,但结果不能重复)。解法 2 只需要在 for 循环里加一行:if (i > index && nums[i] == nums[i-1]) continue; 就能完美去重。解法 1 如果想去重,由于它没有 for 循环作为同层横向对比的锚点,去重逻辑会变得非常绕且难以理解。
天然契合“组合/排列”问题:回溯法最常用于解决排列(Permutations)和组合(Combinations)问题。解法 2 的 for 循环模板可以直接套用到几乎所有回溯题目中(如 N 皇后、电话号码的字母组合等),通用性极强。

解法1和解法2的区别:

  1. 根本区别:对“子集”构建方式的视角不同
    解法 1:每个元素的“选与不选”(二叉树视角)视角:站在元素的角度。每个元素只有两种命运:要么被放进当前子集,要么不放进。递归树:一棵满二叉树。树的第 (i) 层决定第 (i) 个元素。收集时机:只有走到叶子节点(pos == nums.size()),把所有元素都看了一遍后,才收集一次结果。
    解法 2:每一个子集的“长度延伸”(多叉树/组合树视角)视角:站在子集的角度。当前子集需要从剩下的元素里挑一个追加进来,直到没有元素可挑。递归树:一棵不规则的多叉树。收集时机:每走到一个新节点(无论是根节点还是中间节点),当前的 sol 本身就是一个合法子集,直接收集(results.push_back(sol))。
  2. 为什么解法 2 多了个 for 循环?因为解法 2 的多叉树在当前层有多个并列的候选人。以 nums = [1, 2, 3] 举例:如果当前子集是 [1],接下来你可以选择:加 2 (\rightarrow ) 变成 [1, 2]加 3 (\rightarrow ) 变成 [1, 3]这个 for (int i = index; i < nums.size(); ++i) 就是用来横向遍历当前所有可供选择的元素。每执行一次循环体,就代表探索一条新的子集延伸分支。
  3. 解法 2 为什么在 pop_back() 之后不再执行 helper?这是初学者最容易产生困惑的地方。我们把解法 2 的 for 循环拆开来看:cppfor (int i = index; i < nums.size(); ++i) {
    sol.push_back(nums[i]); // 1. 做选择(比如选了nums[i])
    helper(nums, i + 1, sol, results); // 2. 进入下一层递归,去穷举包含nums[i]的所有子集
    sol.pop_back(); // 3. 撤销选择(把nums[i]弹出来)
    }
    Use code with caution:
    原因:横向的 for 循环已经自动承担了“不选”的职责在 pop_back() 之后,紧接着会触发 ++i 进入下一次 for 循环。当 i 变成 i + 1,再次执行 sol.push_back(nums[i+1]) 时,你会发现,刚刚被 pop_back() 弹出的 nums[i] 并没有被放回去。这在实质上就等于**“不选 nums[i],而是直接去选 nums[i+1]”**。所以,解法 2 的“选与不选”是通过循环的推进实现的:helper 之前:选当前 nums[i],并深入向下。pop_back() 之后 + 进入下一次循环:不选刚才的 nums[i],转而去选下一个元素。因此,它不需要像解法 1 那样显式写两遍 helper。如果再写一遍 helper,就会导致重复搜索和逻辑混乱。
    总结:两者的时空对比维度解法 1(选/不选)解法 2(for 循环延伸)树的形状严格的二叉树结构不固定 的多叉树递归调用次数刚好 (2^{n+1}-1) 次刚好 (2^{n}) 次(对应所有子集数量)结果收集位置只能在叶子节点(前序位置判断退出时)在每个节点的刚进入时(前序位置,无条件收集)

解法3:BFS解法:
用 BFS 来解决该问题时,层级关系如下:
第一层: []
第二层: [1] [2] [3]
第三层: [1, 2] [1, 3], [2, 3]
第四层: [1, 2, 3]
每一层的节点都是上一层的节点拓展而来。
注意:

  1. BFS的方法不需要sort。
  2. 一开始queue里要push空集{}。
    代码如下:
class Solution {
public:
    /**
     * @param nums: A set of numbers
     * @return: A list of lists
     */
    vector<vector<int>> subsets(vector<int> &nums) {
        vector<vector<int>> vv;
        int n = nums.size();

        queue<vector<int>> q;
        q.push({});  //push {}
        
        while(!q.empty()) {
            vector<int> v = q.front();
            q.pop();
            vv.push_back(v);
            
            for (int i = 0; i < n; ++i) {
                if (v.size() == 0 || v.back() < nums[i]) {
                    vector<int> v2 = v;
                    v2.push_back(nums[i]);
                    q.push(v2);
                }
            }
        }
        
        return vv;
    }
};

二刷

class Solution {
public:
    /**
     * @param nums: A set of numbers
     * @return: A list of lists
     */
    vector<vector<int>> subsets(vector<int> &nums) {
        vector<vector<int>> vv;
        int n = nums.size();

        queue<vector<int>> q;
        q.push({});  //push {}
        
        while(!q.empty()) {
            vector<int> v = q.front();
            q.pop();
            vv.push_back(v);
            
            for (int i = 0; i < n; ++i) {
                if (v.size() == 0 || v.back() < nums[i]) {
                    v.push_back(nums[i]);
                    q.push(v);
                    v.pop_back();
                }
            }
        }
        
        return vv;
    }
};

解法4:位运算

    vector<vector<int>> subsets(vector<int> &nums) {
        vector<vector<int> > solution;
        vector<int> singleSol;
        int numSize=nums.size();
        int totalNum=pow(2,numSize)-1;
        solution.push_back(singleSol);
        
        for (int i=1; i<=totalNum; ++i) {
            singleSol.clear();
            for(int j=0; j<numSize; ++j) {
                int bitNum = (i>>j)&0x1;
                if (bitNum==1) {
                    singleSol.push_back(nums[j]);
                }
                sort(singleSol.begin(), singleSol.end());
            }

            solution.push_back(singleSol);
        }
        return solution;
    }

效率可能还要改进一下。

另外2种下次写。

另外分析一下算法复杂度。关于DFS的时间复杂度是O(答案个数×构造每个答案时间)。所以以上DFS的时间复杂度都是O(n*2^n)。

===============================
18. Subsets II

Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).

Example
Example 1:

Input: [0]
Output:
[
[],
[0]
]
Example 2:

Input: [1,2,2]
Output:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
Challenge
Can you do it in both recursively and iteratively?

Notice
Each element in a subset must be in non-descending order.
The ordering between two subsets is free.
The solution set must not contain duplicate subsets.

SubSet II 和SubSet类似,但是要注意去重。
以通用回溯解法为例:

   vector<vector<int>> subsetsWithDup(vector<int> &nums) {
        vector<vector<int>> results;
        vector<int> sol;
         
        if (nums.empty()) {
            results.push_back(vector<int>());
            return results;
        }
        
        sort(nums.begin(), nums.end());    
        helper(nums, 0, sol, results);
        return results;
    }
    
    void helper(vector<int>&nums, int index, vector<int>&sol, vector<vector<int>>&results) {
        results.push_back(sol);
        for (int i=index; i<nums.size(); ++i) {
            if ((i!=index) && (nums[i-1]==nums[i]))  //去重
                continue;
            sol.push_back(nums[i]);
            helper(nums, i+1, sol, results);
            sol.pop_back();
        }
    }

为啥这个可以去重呢? 以[1,2,2]为例,

这里写图片描述

      if ((i!=index) && (nums[i-1]==nums[i]))  //去重
                continue;

参考上面的代码,
第2行,取到[2]之后,就不会取第2个2了。
第3行,取到[1,2]之后,不会再取下一个[1,2]。同时它继续调用helper(,index+1,) 这里index+1=2,所以进helper()之后,index=2, i=2==index(第一次),所以第4行还是会有[1,2,2]。

同样,回溯到[2]之后会继续调用helper(,index+1,)。这里index+1=2。所以第3行还是会有[2,2],因为i==index。

网上的解答:
凡是i= index的时候,即便和前一个数相等,也是sol的第一次取到,也是最深的搜索结果一定要获得。 如[1,2,2]中sol=[1,2]开始搜索, index将指向第二个2开始搜索(index= 2),但由于开始i==index, 仍然需要取以获得[1,2,2],只因为和前一个数相等就continue会漏掉[1,2,2]。如果i > index, 那么这样的sol必然已经在之前取得过了并且被搜索过, 就是重复的结果了,同样对[1,2,2]计算,如sol=[1]的情况下去搜索, index= 1,即从第一个2组成的[1,2]进行搜索, 当完成并回溯后,下一个循环中,此时nums[2] = nums[1]且i = 2>index= 1, 同样的[1,2]已经在之前的回溯中都获得了全部的搜索结果,所以要continue.

i != index 实际上上保证递归到下一层的时候如果有重复数,还能被选入。比如[1,2,2],如果得到[1,2],dfs下一层应该是[1,2,2], 如果把i != index单纯换成i >0 的话,这里的第二个2就会被nums[i] == nums[i -1] 跳过而不加入subset,最后结果只有[1,2],没有[1,2,2]。

举例:
[1,2,2,2,2]
第一次 i=0,index=0; i=index; 1 入sol;
第二次 i=1,index=1;i=index;2 入sol;
第三次 i=2, index=2;nums[3]==nums[2]&&i=index, 跳过(continue, 所以index 并不增加);
第四次 i=3,index=2; nums[4]==nums[3]&&i>index, 跳过(continue);

解法2:Subset II也可以用BFS。我参考了Subset的解法,不过这里我用了sort和multimap。
代码如下:

class Solution {
public:
    /**
     * @param nums: A set of numbers.
     * @return: A list of lists. All valid subsets.
     */
    vector<vector<int>> subsetsWithDup(vector<int> &nums) {
        vector<vector<int>> vv;
        int n = nums.size();
        
        sort(nums.begin(), nums.end());
        unordered_map<int, int> um; //number, count
        for (auto i : nums) {
            if (um.find(i) == um.end()) {
                um[i] = 1;
            } else {
                um[i]++;
            }
           
        }
        
        queue<vector<int>> q;
        q.push({});  //push {}
        
        while(!q.empty()) {
            vector<int> v = q.front();
            q.pop();
            vv.push_back(v);
            
            unordered_map<int, int> um_v;
            for (auto i : v) {
                if (um_v.find(i) == um_v.end()) {
                    um_v[i] = 1;
                } else {
                    um_v[i]++;
                }
            }

            for (int i = 0; i < n; ++i) {
                if (v.size() == 0 ||
                    v.back() < nums[i] ||
                    ((v.back() == nums[i]) && (um_v[nums[i]] < um[nums[i]]))) {
                    vector<int> v2 = v;
                    v2.push_back(nums[i]);
                    if (q.back() != v2) {
                        q.push(v2);
                    }
                }
            }
        }
        
        return vv;
    }
};

代码同步在
https://github.com/luqian2017/Algorithm

神联动:LSTM+卡尔曼滤波!一区大门轻松开! 近来热度飙升,成为时间序列预测和状态估计等领域的香饽饽,非常好发高区!主要在于:这两者结合,不仅能提高模型预测准确性;还能拓展应用场景,为我们的论文创新提供发挥空间,且当下还在蓝海阶段,还不算卷。具体点说:卡尔曼滤波擅长处理线性状态估计和噪声,能使LSTM更好地适应动态环境的变化,减少噪声干扰,降低预测误差。而LSTM通过捕捉长期依赖关系,擅长处理非线性时间序列,能够弥补卡尔曼滤波在这方面的不足,从而把应用场景从传统的状态估计,延伸到金融预测、工业检测、自动驾驶等任务。 阅读详情

相关推荐

一文了解向量数据库在RAG中扮演的角色

向量数据库:AI新纪元的基石。探索如何通过这一创新技术优化RAG,提高语言模型的信息处理能力

2401_82452722的博客 2452

LeetCode-----第七十八题-----子集

子集 难度:中等 给定一组不含重复元素的整数数组nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例: 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] 题目解析: 分析一下,它这个不同长度的组合,那么我们是不是只要调用不同长度的回溯法就行了呢,答案是肯定的。 参考代码: class Solution {...

L_smartworld的博客 310

笔记汇总 | 斯坦福 CS229 机器学习

本文为斯坦福大学 2014 秋季 CS229 机器学习课程学习笔记本文主体部分转载自黄海广博士,文末已给出,大家有兴趣可以直接访问笔记首页,下载对应课程资料及作业代码。

ReturnTmp的博客 2461

subset使用

在R语言中,subset()函数用于从数据框中选择满足特定条件的观测。其语法如下:参数说明:x:数据框或矩阵。subset:逻辑条件,用于筛选满足特定条件的行。select:选择的变量,默认选择所有变量。drop:逻辑值,指示是否删除维度。

qq_45759229的博客 2324

手把手教你用CANopen SDO报文控制步进电机(附CIA402协议详解)

本文详细解析了如何通过CANopen SDO报文控制步进电机,深入讲解CIA402协议的核心架构、状态机模型及对象字典管理,并提供实战代码示例。从SDO报文构造到多轴同步控制,帮助开发者掌握工业级步进电机的精确控制技术,适用于自动化设备开发。

weixin_33737774的博客 485

【Leetcode】2685. Count the Number of Complete Components

问其有多少个连通分量满足其每两个点之间都是有边连接的。思路是并查集,搜集每个连通分量的点数和边数,看看是否满足。阶无向无权图,顶点编号从。

数学、算法爱好者的博客 286

uniapp:安卓苹果APP判断是否授权开启手机位置服务+弹框引导跳转到用户手机设置位置服务开启页面,uniApp app判断是否授权位置信息权限如果位置是关闭状态则提示用户(跳转各机型位置设置页面)

uniapp APP判断是否开启位置信息服务&&判断是否授权位置信息权限,uniappapp定位权限被拒绝后,询问是否开启授权并跳转到手机设置页面,uniapp APP端 定位未授权 去手机设置里开启定位,uniapp提示用户开启定位,跳转到开启定位页面,uniapp获取当前位置及检测授权状态,uniapp中获取位置信息处理,uni-app实现定位功能_uniapp获取定位位置信息,uniapp中app是否开启定位,app获取地理位置,uniapp打开位置权限设置页面IOS,用户并没有开启微信信息服务或者没

✅ 精选推荐文章 4342

子集和问题 算法_子集/组合/全排列与回溯

今天就来聊三道考察频率高,而且容易让人搞混的算法问题求子集(subset)求排列(permutation)求组合(combination)这几个问题都可以用回溯算法解决。子集输入一个不包含重复数字的数组,要求算法输出这些数字的所有子集 比如输入 nums = [1,2,3],你的算法应输出 8 个子集,包含空集和本身,顺序可以不同:[ [],[1],[2],[3],[1,3],[2,3],[1,2...

weixin_39810901的博客 663

Hadoop在大数据领域的电商数据分析案例

随着电商行业的迅猛发展,每天都会产生海量的数据,如用户浏览记录、购买行为、商品信息等。如何从这些数据中提取有价值的信息,为电商企业的决策提供支持,成为了电商企业面临的重要问题。Hadoop作为一个开源的分布式计算平台,具有高可靠性、高扩展性和高效性等特点,能够很好地处理大数据。本文的目的就是通过实际案例,详细介绍Hadoop在电商数据分析中的应用,范围涵盖了从数据采集、存储到分析的整个流程。本文首先介绍背景信息,让读者了解Hadoop在电商数据分析中的重要性和应用场景。

Java大师兄的博客 1178

10.28华为OD机试真题 新系统 - 社交网络消息转发 (Java/Py/C/C++/Js/Go)

10.28华为OD机试真题 新系统 - 社交网络消息转发 (Java/Py/C/C++/Js/Go)

算法大师! 402

(lintcode)第17题 子集

要求:给定一个含不同整数的集合,返回其所有的子集 注意事项:子集中的元素排列必须是非降序的,解集必须不包含重复的子集。 样例 如果 S =[1,2,3],有如下的解: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] 思路:不考虑非降序,一个个数字插进去,每一层插进去一个,每一个都有两种情

秦怀杂货店 1439

Altium Designer 超详细入门教程

本文是一份Altium Designer新手入门教程,详细介绍了从软件基础到PCB制版的全流程。主要内容包括:软件界面介绍与工程创建方法;原理图设计中的元件放置、电气连线、标注添加等操作;PCB设计的布局布线、铺铜和DRC检查;Gerber和钻孔文件的导出方法。教程还提供了分类整理的实用快捷键表和新手避坑指南,强调原理图编译和DRC检查的重要性。通过本教程,新手可以快速掌握AD基本操作,完成简单电路板的设计与制版文件导出。

学习中...... 815

[Lintcode]17. Subsets/[Leetcode]78. Subsets

17. Subsets/78. Subsets 本题难度: Medium Topic: Search & Recursion Description Given a set of distinct integers, return all possible subsets. Example Example 1: Input: [0] Output: [ [], [0]] Example...

weixin_30677073的博客 111

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Leetcode 78/LintCode 17 - subsets

题目 Given a set of distinct integers, nums, return all possible subsets.For example, If nums = [1,2,3], a solution is:[ [], [1], [1,2], [1,2,3], [1,3], [2], [2,3], [3] ] ...

weixin_34255793的博客 129

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

35 子集II(Subsets II)

文章目录1 题目2 解决方案2.1 思路2.2 图解2.3 时间复杂度2.4 空间复杂度3 源码 1 题目 题目:子集II(Subsets II) 描述:给定一个可能具有重复数字的列表,返回其所有可能的子集。 子集中的每个元素都是非降序的 两个子集间的顺序是无关紧要的 解集中不能包含重复子集 lintcode题号——18,难度——medium 样例1: 输入:nums = [0] 输出: [ [], [0] ] 解释: [0]的子集只有[]和[0]。 样例2: 输入:nums = [1,2

SeeDoubleU的专栏 359

subsets

子集系列(一) 传统subset 问题,例 [LeetCode] Subset, Subset II, Bloomberg 的一道面试题 引言 Coding 问题中有时会出现这样的问题:给定一个集合,求出这个集合所有的子集(所谓子集,就是包含原集合中的一部分元素的集合)。 或者求出满足一定要求的子集,比如子集中元素总和为定值,子集元素个数为定值等等。 我把它们归类为子集系列问题

screaming的博客 423

subset问题

CODE。

luoyixin2009的博客 456

数字/字符串排列组合(Leetcode) 总结

综述:使用递归求解问题有时往往令人费解,博主对递归也是头痛不已,以下问题,利用递归很容易求解。总的来说,递归需要设计成:处理单个问题,递归求解子问题,设置出口。需要铭记的是递归所做的工作和处理单个问题一样,所以只要单个问题取遍所有情况,那么递归同样也能取得所有情况。切记不要去想递归到底怎么一层层的调用,不管是读代码还是写代码,需要关注的是递归出口,程序怎么设计求解单个问题,一旦单个问题解决了,后续...

刘洋_heaven的博客 6776

LeetCode 之 Subsets(图和暴力枚举)

LeetCode 之 Subsets,本文给出基于图的深度优先检索的算法思想与C++ STL源码实现。

稚枭天卓 1410

Subset笔记

找全部子集 subset习题链接 算法:每次向res中的所有集合中添加下一个原集合元素 【错误】:每次都要copy res集合和element集合 res集合copy 是防止元素不停增加导致无限循环 element集合copy 是防止在原集合位置中做出修改 def subset(set): res = [[]] for element in set: for set_visited in res[:]: x = set_visited[:]

weixin_46145616的博客 791

从阶乘递归到subset题解的递归思想扩展

本文是对LintCode/LeetCode的求不同元素集合的全部子集问题的思考总结。解题思路大致有三种,本文运用递归思路,从计算阶乘开始着手,逐步推广到本题题解,使本解法更加易于理解。

huanqing2010的专栏 1352

Subset 解题报告

description: Given a set of distinct integers, return all possible subsets.NoticeElements in a subset must be in non-descending order. The solution set must not contain duplicate subsets. Have you m

ncst 426

子集算法

子集数量=2 ^ n = 1 (空集) + (2^n-1) (非空子集) 算法原理:每个元素有两种处理方式,取或不取,共2 ^ n 种组合 递归算法 boolean[] done 为标志数组,表明对应位置元素取或不取 public static void recursion(int[] root) { Objects.requireNonNull(root); boolean[] ...

大知无涯者 8198

subsetII

#include<iostream> #include<vector> using namespace std; class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>&gt...

zwzcdcll的博客 247

LintCode 18. 子集 II SubsetsWithDup

比不重复的多了一段代码,if (i!=startIndex&amp;&amp;nums[i]==nums[i-1]){ continue; }有点难懂,记一下 import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import java....

维 371

LintCode 17. 子集

给定一个含不同整数的集合,返回其所有的子集public class Solution { /** * @param nums: A set of numbers * @return: A list of lists */ public List&lt;List&lt;Integer&gt;&gt; subsets(int[] nums) { ...

老汉技术专栏 251
上一篇: LintCode-86: Binary Search Tree Iterator
下一篇: LintCode-680: Split String DFS 经典题
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值