Leetcode(77)——组合

leetcode第77题python版组合_回溯法 77. 组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 阅读详情

Leetcode(77)——组合

题目

给定两个整数 n 和 k,返回范围 [ 1 , n ] [1, n] [1,n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

示例 1:

输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]

示例 2:

输入:n = 1, k = 1
输出:[[1]]

提示:

  • 1 1 1 <= n <= 20 20 20
  • 1 1 1 <= k <= n n n

题解

方法一:回溯法

思路

​​  类似于排列问题,比如 Leetcode.46.全排列,我们也可以进行回溯。但是 排列回溯的是交换的位置,而组合回溯的是是否把当前的数字加入结果中。
在这里插入图片描述
​​  在这里我们还是用了剪枝以优化算法,从而减小时间复杂度——通过剪去无意义的遍历和递归。

​​  如果当前 nums \textit{nums} nums 的大小为 s s s,未确定状态的区间 [ cur , n ] [\textit{cur}, n] [cur,n] 的长度为 t t t,如果 s + t < k s + t < k s+t<k,那么即使 t t t 个都被选中,也不可能构造出一个长度为 k k k 的序列,故这种情况就没有必要继续向下递归——即我们可以在每次递归开始的时候做一次这样的判断。

​​  下面的图片绿色部分是剪掉的枝叶,当 n n n 很大的时候,能少遍历很多结点,节约了时间。
在这里插入图片描述

代码实现

Leetcode 官方题解:

class Solution {
public:
    vector<int> temp;
    vector<vector<int>> ans;

    void dfs(int cur, int n, int k) {
        // 剪枝:temp 长度加上区间 [cur, n] 的长度小于 k,不可能构造出长度为 k 的 temp
        if (temp.size() + (n - cur + 1) < k) {
            return;
        }
        // 记录合法的答案
        if (temp.size() == k) {
            ans.push_back(temp);
            return;
        }
        // 考虑选择当前位置
        temp.push_back(cur);
        dfs(cur + 1, n, k);
        temp.pop_back();
        // 考虑不选择当前位置
        dfs(cur + 1, n, k);
    }

    vector<vector<int>> combine(int n, int k) {
        dfs(1, n, k);
        return ans;
    }
};

我自己的:

// 初始版本
class Solution {
    vector<int> nums;
    vector<vector<int>> ans;
    void DFS(int k, int n, int first){
        if(k == nums.size()){
            ans.emplace_back(nums);
        }else{
            for(int i = first; i <= n; i++){
                nums.push_back(i);
                DFS(k, n, i+1);
                nums.pop_back();
            }
        }
    }
public:
    vector<vector<int>> combine(int n, int k){
        // [1, n] 中的 C{k_n}
        int last = n+1-k;
        DFS(k, n, 1);
        return ans;
    }
};

// 改进后(剪枝法)
class Solution {
    vector<int> nums;
    vector<vector<int>> ans;
    void DFS(int k, int n, int first){
        if(k-nums.size() > n-first+1) return;   // 剪枝
        if(k == nums.size()){
            ans.emplace_back(nums);
        }else{
            for(int i = first; i <= n; i++){
                nums.push_back(i);
                DFS(k, n, i+1);
                nums.pop_back();
            }
        }
    }
public:
    vector<vector<int>> combine(int n, int k){
        // [1, n] 中的 C{k_n}
        int last = n+1-k;
        DFS(k, n, 1);
        return ans;
    }
};
复杂度分析
  • 时间复杂度: O ( ( n k ) × k ) O({n \choose k} \times k) O((kn​)×k)
  • 空间复杂度: O ( n + k ) = O ( n ) O(n+k)=O(n) O(n+k)=O(n),因为 n > = k n >= k n>=k,即递归使用栈空间的空间代价和临时数组 nums \textit{nums} nums 的空间代价。

方法二:非递归(字典序法)实现组合型枚举

思路

​​  这里的非递归版不是 简单的用栈模拟递归转化为非递归:我们希望通过合适的手段,消除递归栈带来的额外空间代价。

​​  假设我们把原序列中被选中的位置记为 1 1 1,不被选中的位置记为 0 0 0,对于每个方案都可以构造出一个二进制数。我们让原序列从大到小排列(即 { n , n − 1 , ⋯ 1 , 0 } \{ n, n - 1, \cdots 1, 0 \} {n,n−1,⋯1,0})。我们先看一看 n = 4 n = 4 n=4, k = 2 k = 2 k=2 的例子:
在这里插入图片描述
​​  我们可以看出 「对应的二进制数」一列包含了由 k k k 个 1 1 1 和 n − k n - k n−k 个 0 0 0 组成的所有二进制数,并且它们按照字典序排列。这给了我们一些启发,我们可以通过某种方法枚举,使得生成的序列是根据字典序递增的。我们可以考虑有一个二进制数数字 x x x,它由 k k k 个 1 1 1 和 n − k n - k n−k 个 0 0 0 组成,如何找到它的字典序中的下一个数字 n e x t ( x ) {next}(x) next(x) 呢?这里分两种情况:

  • 规则一: x x x 的最低位为 1 1 1,这种情况下,如果末尾由 t t t 个连续的 1 1 1,我们直接将倒数第 t t t 位的 1 1 1 和倒数第 t + 1 t + 1 t+1 位的 0 0 0 替换,就可以得到 n e x t ( x ) {next}(x) next(x)。如 0011 → 0101 0011 \rightarrow 0101 0011→0101, 0101 → 0110 0101 \rightarrow 0110 0101→0110, 1001 → 1010 1001 \rightarrow 1010 1001→1010, 1001111 → 1010111 1001111 \rightarrow 1010111 1001111→1010111。
  • 规则二: x x x 的最低位为 0 0 0,这种情况下,末尾有 t t t 个连续的 0 0 0,而这 t t t 个连续的 0 0 0 之前有 m m m 个连续的 1 1 1,我们可以将倒数第 t + m t + m t+m 位置的 1 1 1 和倒数第 t + m + 1 t + m + 1 t+m+1 位的 0 0 0 对换,然后把倒数第 t + 1 t + 1 t+1 位到倒数第 t + m − 1 t + m - 1 t+m−1 位的 1 1 1 移动到最低位。如 0110 → 1001 0110 \rightarrow 1001 0110→1001, 1010 → 1100 1010 \rightarrow 1100 1010→1100, 1011100 → 1100011 1011100 \rightarrow 1100011 1011100→1100011。

​​  至此,我们可以写出一个简单的算法,用一个长度为 n n n 的 0 / 1 0/1 0/1 数组来表示选择方案对应的二进制数,初始状态下最低的 k k k 位全部为 1 1 1,其余位置全部为 0 0 0,然后不断通过上述方案求 n e x t next next,就可以构造出所有的方案。
— — — — 接 下 来 将 进 一 步 优 化 算 法 — — — — ————接下来将进一步优化算法———— ————接下来将进一步优化算法————

​​  我们可以进一步优化实现,我们来看 n = 5 n = 5 n=5, k = 3 k = 3 k=3 的例子,根据上面的策略我们可以得到这张表:
在这里插入图片描述
​​  在上面的方法中我们通过二进制数来构造方案,而二进制数是需要通过迭代的方法来获取 n e x t next next 的。

​​  现在考虑不通过二进制数,直接在方案上变换来得到下一个方案。假设一个方案从低到高的 k k k 个数分别是 { a 0 , a 1 , ⋯   , a k − 1 } \{ a_0, a_1, \cdots, a_{k - 1} \} {a0​,a1​,⋯,ak−1​},我们可以从低位向高位找到第一个 j j j 使得 a j + 1 ≠ a j + 1 a_{j} + 1 \neq a_{j + 1} aj​+1​=aj+1​,我们知道出现在 a a a 序列中的数字在二进制数中对应的位置一定是 1 1 1,即表示被选中,那么 a j + 1 ≠ a j + 1 a_{j} + 1 \neq a_{j + 1} aj​+1​=aj+1​ 意味着 a j a_j aj​ 和 a j + 1 a_{j + 1} aj+1​ 对应的二进制位中间有 0 0 0,即这两个 1 1 1 不连续。此时我们把 a j a_j aj​ 对应的 1 1 1 向高位推送,也就对应着 a j ← a j + 1 a_j \leftarrow a_j + 1 aj​←aj​+1,而对于 i ∈ [ 0 , j − 1 ] i \in [0, j - 1] i∈[0,j−1] 内所有的 a i a_i ai​ 把值恢复成 i + 1 i + 1 i+1,即对应这 j j j 个 1 1 1 被移动到了二进制数的最低 j j j 位。
​​  这似乎只考虑了上面的「规则二」。但是实际上 「规则一」是「规则二」在 t = 0 t = 0 t=0 时的特殊情况,因此这么做和按照两条规则模拟是等价的。

​​  在实现的时候,我们可以用一个数组 temp \textit{temp} temp 来存放 a a a 序列,一开始我们先把 1 1 1 到 k k k 按顺序存入这个数组,他们对应的下标是 0 0 0 到 k − 1 k - 1 k−1。为了计算的方便,我们需要在下标 k k k 的位置放置一个哨兵 n + 1 n + 1 n+1(思考题:为什么是 n + 1 n + 1 n+1 呢?)。然后对这个 temp \textit{temp} temp 序列按照这个规则进行变换,每次把前 k k k 位(即除了最后一位哨兵)的元素形成的子数组加入答案。每次变换的时候,我们把第一个 a j + 1 ≠ a j + 1 a_{j} + 1 \neq a_{j + 1} aj​+1​=aj+1​ 的 j j j 找出,使 a j a_j aj​ 自增 1 1 1,同时对 i ∈ [ 0 , j − 1 ] i \in [0, j - 1] i∈[0,j−1] 的 a i a_i ai​ 重新置数。如此循环,直到 temp \textit{temp} temp 中的所有元素为 n n n 内最大的 k k k 个元素。

​​  思考题:为什么是 n + 1 n + 1 n+1 呢?
​​  回过头看这个思考题,它是为了我们判断退出条件服务的。我们如何判断枚举到了终止条件呢?其实不是直接通过 temp \textit{temp} temp 来判断的,我们会看每次找到的 j j j 的位置,如果 j = k j = k j=k 了,就说明 [ 0 , k − 1 ] [0, k - 1] [0,k−1] 内的所有的数字是比第 k k k 位小的最后 k k k 个数字,这个时候我们找不到任何方案的 k k k 位序列的字典序比当前方案的序列大了,此时结束枚举。

代码实现

Leetcode 官方题解:

class Solution {
public:
    vector<int> temp;
    vector<vector<int>> ans;

    vector<vector<int>> combine(int n, int k) {
        // 初始化
        // 将 temp 中 [0, k - 1] 每个位置 i 设置为 i + 1,即 [0, k - 1] 存 [1, k]
        // 末尾加一位 n + 1 作为哨兵
        for (int i = 1; i <= k; ++i) {
            temp.push_back(i);
        }
        temp.push_back(n + 1);
        
        int j = 0;
        while (j < k) {
            ans.emplace_back(temp.begin(), temp.begin() + k);
            j = 0;
            // 寻找第一个 temp[j] + 1 != temp[j + 1] 的位置 t
            // 我们需要把 [0, t - 1] 区间内的每个位置重置成 [1, t]
            while (j < k && temp[j] + 1 == temp[j + 1]) {
                temp[j] = j + 1;
                ++j;
            }
            // j 是第一个 temp[j] + 1 != temp[j + 1] 的位置
            ++temp[j];
        }
        return ans;
    }
};

我自己的:

class Solution {
public:
    vector<int> nums;
    vector<vector<int>> ans;

    vector<vector<int>> combine(int n, int k){
        // 初始化
        for(int i = 1; i <= k; ++i)
            nums.push_back(i);
        nums.push_back(n + 1);  // 哨兵
        int j = 0;
        while(j < k){
            // 插入新序列
            ans.emplace_back(nums.begin(), nums.end()-1);
            // 更新新序列
            // 找到第一个 nums_j + 1 != nums_{j+1} 的数,并在二进制数中将对应的位数至 nums_{j+1} 对应的位数交换
            // 即在序列 nums 中令 nums_j = nums_j + 1
            // 并令序列中 nums_i 属于 [0, j-1] 的 nums_i = i+1
            for(j = 0; j < k; j++){
                if(nums[j]+1 != nums[j+1]) break;
                else nums[j] = j+1;
            }
            nums[j] = nums[j]+1;
        }
        return ans;
    }
};
复杂度分析
  • 时间复杂度: O ( ( n k ) × k ) O({n \choose k} \times k) O((kn​)×k)。外层循环的执行次数是 ( n k ) n \choose k (kn​) 次,每次需要做一个 O ( k ) O(k) O(k) 的添加答案和 O ( k ) O(k) O(k) 的内层循环,故时间复杂度 O ( ( n k ) × k ) O({n \choose k} \times k) O((kn​)×k)。
  • 空间复杂度: O ( k ) O(k) O(k)。即辅助数组 temp \textit{temp} temp 的空间代价。
力扣77--组合 给定两个整数n和k,返回范围[1, n]中所有可能的k个数的组合。你可以按返回答案。 阅读详情

相关推荐

【组合】组合求解思路

组合,回溯算法,深度优先搜索,dfs,剪枝优化

优快云 2278

leetcode系列--77.组合

leetcode系列–第77题.组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 输入:n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] /** * @param {number} n * @param {number} k * @return {number[][]} */ var combine = function (n,

weixin_41198447的博客 435

【中等】力扣算法题解析LeetCode77:组合

本文介绍了使用回溯法解决组合问题的思路,并进行了剪枝优化。题目要求在1到n的范围内生成所有k个数的组合,通过递归选择数字并回溯撤销选择,确保组合不重复。剪枝优化通过限制循环范围减少无效递归,提高效率。代码实现采用Java,通过动态调整起始位置确保剩余数字足够组成组合。时间复杂度接近最优解O(C(n,k))。文章还提供了示例和调试信息,帮助理解算法过程。

ylumwd的博客 326

「leetcode」77.组合【回溯算法】详解!

回溯法的第一道题目,就不简单呀!

代码随想录 1413

关于RT-Thread中PWM无法正常输出的学习

按照官方的PWM配置,并没有输出PWM,网上有比较多的办法,试了很多,有些还是不能实现输出,这里做个记录。记录自己完成PWM输出的过程,以及修改的地方。 关于STM32CubeMX配置就不多说了,网上有很多。 首先必定是按照流程来,一定一定按照流程来!!! 需要注意的是加上通道数!!!! 这是流程上没有的,也是RTT的一点小BUG吧 配上board.c中添加的代码,我用的是PA2定时2的通道3,需要使用的朋友修改对应定时器和GPIO! void HAL_TIM_Base_MspInit(TIM_Han

weixin_42566346的博客 3550

WangEditor 5.0版本dangerouslyInsertHtml方法的正确使用方式

WangEditor 5.0版本dangerouslyInsertHtml方法的正确使用方式

yang1067155909的专栏 4290

【LeetCode】77. 组合

题目 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。 示例: 输入:n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 解题思路 重点概括: 如果解决一个问题有多个步骤,每一个步骤有多种方法,题目又要我们找出所有的方法,可以使用回溯算法; 回溯算法是在一棵树上的 深度优先遍历(因为要找所有的解,所以需要遍历); 组合问题,相对于排列问题而言,不计较一个组合内元...

jiiiiiaaaa的博客 413

LaTeX伪代码字体大小调整全攻略:从algorithm到algorithm2e的实战技巧

本文详细介绍了在LaTeX中调整伪代码字体大小的全面技巧,涵盖algorithm、algorithmicx和algorithm2e等主流算法包的使用方法。从基础命令到高级配置,帮助用户解决学术论文和技术文档中的伪代码排版问题,提升算法展示的专业性和可读性。特别针对不同期刊格式要求,提供了实用的字体调整方案。

weixin_29297127的博客 436

力扣leetcode77组合C++

力扣leetcode77组合C++题目链接解题思路三级目录 题目链接 77. 组合 解题思路 今天这道题目是采用了回溯的思想 所谓回溯,就是穷举问题的所有可能性,从中选择合适的结果,返回返回上一层,继续选择。 读者已更改能够大 三级目录 ...

qq_36711295的博客 416

边缘智能新篇章:RK3588上YOLOv8姿态估计的轻量化部署与性能优化实战

本文详细介绍了在RK3588平台上部署和优化YOLOv8姿态估计模型的完整流程。通过模型转换、ONNX中间表示和性能优化策略,实现在边缘设备上的高效实时推理,为嵌入式AI应用提供可行的轻量化解决方案。

ik6789012的博客 149

用Python实现单层感知器:5分钟搞定逻辑与/或/异或分类(附避坑指南)

本文通过Python代码实战,详细讲解了单层感知器的核心原理与实现步骤,5分钟内即可完成逻辑与、或运算的分类任务。文章深入剖析了单层感知器的能力边界,解释了其无法解决异或(XOR)等线性不可分问题的根本原因,并提供了学习率设置、权重初始化等关键避坑指南,帮助初学者直观理解神经网络的基础。

ttt77的博客 1084

77.组合- 力扣(LeetCode)

combinations (组合)符合题意,创建列表[i for i in range(1, n + 1)],组合个数k,返回的一个迭代器对象,每个元素tuple格式,转换格式即可得到答案。输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]生成可迭代对象中所有长度为 r 的无重复元素组合(不考虑顺序,元素不重复)。生成可迭代对象中所有长度为 r 的可重复元素组合(不考虑顺序,元素可重复)。生成可迭代对象中所有长度为 r 的排列(考虑顺序,元素不重复)。

2401_87004385的博客 663

【UE5】多用户协同编辑实战:从配置到实时协作

本文详细介绍了在虚幻引擎5中配置和使用多用户协同编辑功能的完整流程。从启用Multi-User Editing插件、配置UDP Messaging网络通信,到启动服务器、创建会话并实现实时协作,提供了从环境准备到实战协作的清晰指南。文章还分享了资产同步、场景分批、对象锁定等实用技巧,并强调了网络配置与版本一致性等关键避坑点,旨在帮助中小型团队提升关卡设计和原型开发的协作效率。

weixin_29001683的博客 265

77. 组合【 力扣(LeetCode) 】

题目要求从1到n的整数中生成所有可能的k个数的组合。解题思路采用回溯法结合剪枝策略,确保生成的序列是递增的,从而避免重复。具体步骤包括:递归遍历每个位置的可能值,如果当前元素超出范围则剪枝;将合法元素加入序列,如果序列长度达到k则加入结果集;递归结束后回溯,移除最后一个元素。参考代码通过深度优先搜索(DFS)实现,时间复杂度为O(k * C(n, k)),空间复杂度为O(k)。

yyh520025的博客 1050

静态分析工具COBOT与Testbed对比

Testbed为规则检查工具的代表,市场占有量非常大,但随着时间的推移,大家从规则匹配转向了用静态分析工具检查Bug,所以规则检查型工具占有量比开始时候已经减少,但仍有一些比较落后的单位还在继续采购此类工具。3、通过对开源工程的测试,进行误漏报率的对比,发现COBOT(库博)的误漏报率相比Testbed较低,因COBOT主打国内市场,在众多军工单位进行大量试用及使用,吸取了众多单位的意见和建议,更加符合国内军工单位的使用习惯及测试要求。4、此外库博在功能上还可以进行计划任务,检测队列,检测并发的功能支持。

chengoodflower的博客 2054

Quartus (Quartus Prime 18.1)的安装及仿真步骤

前两天做计组的课设需要用到Quartus 这个软件,但安装有点麻烦,在网上搜了很多教程,发现都是旧版本的,最后弄了好半天才把环境搭建好。所以,分享一下它的搭建过程。 因为我不经常用它,所以安装的版本是精简版的其他版本的也应该差不多以下是需要下载的安装包: 准备: Quartus Prime 精简版,最新发布: v18.1 1. QuartusLiteSetup-18.1.0.625-wi...

weixin_41082948的博客 8万+

力扣77:组合(leetcode77:combinations)

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 如果解决一个问题有多个步骤,每一个步骤有多种方法,题目又要我们找出所有的方法,可以使用回溯算法;回溯算法是在一棵树上的 深度优先遍历。

xxxnnn1991的博客 247

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【算法题】77.组合-力扣(LeetCode)

那么该如何剪枝呢? 这是这题的关键 我们发现: 这些被剪枝掉的节点都小于等于它们的父节点,换句话来说,那些被保留的节点,都大于它们的父节点 所以我们只需要保留那些比它们父节点大的节点就行了

Janium的博客 659

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LeetCode 力扣 77. 组合

题目描述(中等难度) 给定 n ,k ,表示从 { 1, 2, 3 ... n } 中选 k 个数,输出所有可能,并且选出数字从小到大排列,每个数字只能用一次。 解法一 回溯法 这种选数字很经典的回溯法问题了,先选一个数字,然后进入递归继续选,满足条件后加到结果中,然后回溯到上一步,继续递归。直接看代码吧,很好理解。 public List<List<Integer>> ...

wind_liang的博客 1047

老版QQ原生表情gif动态

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

力扣题解-77. 组合

回溯算法

lpp 5386

LeetCode77.组合

力扣(leetcode)77.组合——深搜(DFS) 原题传送门 题解: 排列组合+dfs:从n个不同的数字中找出k个不同的数字,一共有C(n,k)中情况;这道题需要全排列,用深度优先搜索(dfs)就能搞定。 上代码。 class Solution { public: int n,k; vector <vector <int>>ans; vector...

Ember_Sky 711

77. 组合(力扣LeetCode)

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。输入:n = 4, k = 2。输入:n = 1, k = 1。

m0_73841621的博客 1081

Leetcode77 组合

剑指offer77 组合题目描述题目类别解题思路具体实现 题目描述 给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。 题目类别 组合 dfs回溯,剪枝 解题思路 代码完整性:代码判空 dfs回溯,剪枝 取第一个数字,再从后面的数字中取k-1个。取第二个数字,再从后面数字中取k-1个,直到某个数字后面不足k-1个,回溯剪枝。 具体实现 class Solution { pu...

qq_36400206的博客 342

leetcode力扣77. 组合

给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。 示例: 输入:n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 这个主要思想就是回溯法,在回溯函数调用之后去掉一个答案,回溯调用之前加入一个答案 class Solution(object): def...

kaggle expert,全球排名前1000,清华计算机研究生,兴趣算法工程 553

力扣77. 组合

力扣77. 组合

LNsupermali的博客 1096
上一篇: Leetcode(46)——全排列
下一篇: Leetcode(79)——单词搜索
486L
博客等级 码龄7年 20粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值