首页 > 编程语言 >算法练习-day21

算法练习-day21

时间:2023-07-19 23:03:02浏览次数:40  
标签:tmp digits arr return 组合 int 练习 day21 算法

回溯算法

77. 组合

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

示例:

算法练习-day21_回溯算法

      思路:本题的思想,主要是利用回溯的思想,先固定tmp插入的个数为k,当检测到tmp的大小等于k时,直接加入到我们的存储组合数组arr中,这时回溯一趟的结束条件;然后是遍历过程,定义一个起始位置,加入组合中,递归函数,不断添加新的元素进入组合中,再插入arr中,插入完一次,说明最后一个元素使用结束,移除在加入下一个元素,重复循环,直到所有组合存储完毕,返回arr

C++代码:

    vector<vector<int>> arr;
    vector<int> tmp;
    void ComArr(int n,int k,int begin)
    {
        if(tmp.size()==k)
        {
            arr.push_back(tmp);
            return;
        }
        for(int i=begin;i<=n;i++)
        {
            tmp.push_back(i);
            ComArr(n,k,i+1);
            tmp.pop_back();
        }
    }
    vector<vector<int>> combine(int n, int k) {
        ComArr(n,k,1);
        return arr;
    }

216. 组合总和 III

题意:找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

  1. 只使用数字1到9
  2. 每个数字 最多使用一次 

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

示例:

算法练习-day21_回溯算法_02

思路:本题和上一道题的思路几乎一模一样,只是有两点不同:

  1. 组合数的范围在1到9之间,并不是1到n
  2. 每次回溯终止条件,只要满足tmp的大小等于k就必须返回,无论数组和是否等于n

C++代码:

    vector<vector<int>> arr;
    vector<int> tmp;
    int SumArr(vector<int> ss)//对数组进行累加
    {
        int sum=0;
        for(auto e:ss)
        {
            sum+=e;
        }
        return sum;
    }
    void ComSumArr(int k,int n,int begin)
    {
        if(tmp.size()==k)//回溯终止条件,无论数组和是否等于n,都必须返回;等于n,先插入arr中,再返回
        {
            if(SumArr(tmp)==n)
            {
                arr.push_back(tmp);
            }
            return;
        }
        for(int i=begin;i<=9;i++)//严格限制组合数的范围
        {
            tmp.push_back(i);
            ComSumArr(k,n,i+1);
            tmp.pop_back();
        }
    }
    vector<vector<int>> combinationSum3(int k, int n) {
        ComSumArr(k,n,1);
        return arr;
    }

17. 电话号码的字母组合

题意:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

算法练习-day21_回溯算法_03

示例:

算法练习-day21_回溯算法_04

       思路:本题的思路就是先列举出每个数字对应的字母集合,然后将数字对应的第一个字母写入集合中,直到最后一个数字,才开始进行回溯算法,就像二叉树的后序遍历一样,从叶子开始一个个组合,再到上一层,这样循环组合

C++代码:

    string sum[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};//这里对应了0~9数字的字母
    vector<string> arr;
    string tmp;
    void ComStrArr(string digits,int begin)
    {
        if(tmp.size()==digits.size())//只要tmp大小等于digits大小,就说明可以存入了
        {
            arr.push_back(tmp);
            return;
        }
        int Num=digits[begin]-'0';
        string SumNum=sum[Num];//将一个数字对应的字母集合对应起来
        for(int i=0;i<SumNum.size();i++)//开始回溯组合
        {
            tmp.push_back(SumNum[i]);
            ComStrArr(digits,begin+1);
            tmp.pop_back();
        }
    }
    vector<string> letterCombinations(string digits) {
        if(digits.size()==0)
        {
            return arr;
        }
        ComStrArr(digits,0);
        return arr;
    }

标签:tmp,digits,arr,return,组合,int,练习,day21,算法
From: https://blog.51cto.com/u_15209404/6781145

相关文章

  • 文心一言 VS 讯飞星火 VS chatgpt (63)-- 算法导论6.5 2题
    文心一言VS讯飞星火VSchatgpt(63)--算法导论6.52题二、试说明MAX-HEAP-INSERT(A,10)在堆A=(15,13,9,5,12,8,7,4,0,6,2,1)上的操作过程。文心一言:MAX-HEAP-INSERT(A,10)是将元素10插入到堆A中并保持堆性质的函数。下面是在堆A=(15,13,9,5,12,8,7,4,0,6,2,1)上执行MAX-......
  • c语言 排序算法
    //sort_algorituhm.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。//#include<iostream>#include<algorithm>usingnamespacestd;#defineelemtypeint//冒泡排序法,组个遍历,大数往后,每次都是"完全遍历",从0开始voidsort_bubbling(elemtype*p,ints......
  • 2023“钉耙编程”中国大学生算法设计超级联赛(1)
    1001Hide-And-SeekGame题意:给出一颗树,两人在树上特定两点来回走,问最早在那个节点相遇思路:枚举所有点,看它是否同时在两条链上,如果在,那么结合周期、两人最早到达时间,返回到达时间得到4个同余方程(拓展欧几里得),然后得到最小可能解#pragmaGCCoptimize(2)#pragmaGCCoptimize(3......
  • 数据结构与算法 头歌 图的拓扑排序算法
    数据结构与算法之图的拓扑排序算法导言拓扑排序是对有向无环图(DirectedAcyclicGraph,DAG)进行排序的一种算法。在实际开发中,拓扑排序算法常用于解决任务调度、编译顺序等问题。本文将介绍拓扑排序算法的实现过程,并帮助初学者理解该算法的原理及代码实现。拓扑排序流程以下......
  • KMP算法笔记
    1.概念解析前置:将原串称之为文本串,匹配串称之为模式串。KMP的实质其实就是:利用已经匹配的信息,来加速查找的过程。对于暴力解法而言,当我进行模式串匹配时,遇到一个不匹配的字符,那么只能一步一步往下滑动,然后重新匹配。但是对于KMP算法而言,利用到了前缀子......
  • 最短路之dijkstra算法
    dijkstra比之上次介绍的的bellman-ford算法的用途上最大的区别就是dijkstra只可用于求无负权边图中的最短路,堆优化后的dij比bellman-ford的复杂度(mn)更小(mlogn)代码源关于dijkstra的解释简单来讲就是每次选出一个没被选过的离起点最近的点,松弛这个点所在的每个边,直到所有点都被......
  • 4.4列表练习题平方和
      ......
  • 最短路之 Bellman-ford 算法
    bellman-ford算法的思想:若有向图有n个点,m条边。扫描所有边,对每条边进行一次松弛(即对a,b为端点,权重为w的边,dist[b]=min(dist[a],dist[a]+w))重复此流程(最多重复n次)直到没有更新操作发生例题1bellmanford板子给你一张n个顶点m条边的有向简单图,顶点编号从1到......
  • leetcode练习
    分类题单:code难度:简单中等困难类型:数组链表字符串二叉树排序解法:递归和迭代滑动窗口 MapStack堆双指针​ 前缀和动态规划解答:解答code[1.两数之和](#1.两数之和)[2.两数相加](#2.两数相加)[3.无重复字符的最长子串](#3.无重复字符的最长子串)[5.......
  • 历年检测、分割、生成算法梳理(2023)
    检测算法 分割算法 生成算法 ......