77.组合

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

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

示例 1:

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

思路:

组合问题就是子集问题,求k个数的组合,也就是求有k个元素的子集 

class Solution {
public:vector<vector<int>> res;int k;vector<vector<int>> combine(int n, int k) {this->k=k;vector<int> track;backtrack(n,1,track);return res;}void backtrack(int n,int start,vector<int>& track){if(track.size()==k)//返回k个数的组合{res.push_back(track);return ;} for(int i=start;i<=n;i++)//可选择的只有start及它后面的元素{track.push_back(i);//做选择backtrack(n,i+1,track);//进入下一层决策树track.pop_back();//撤销选择}}
};

40.组合总和II

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次 。

注意:解集不能包含重复的组合。

示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]
示例 2:

输入: candidates = [2,5,2,1,2], target = 5,
输出:
[
[1,2,2],
[5]
]

思路:

组合问题就是子集问题,candidate中有重复元素,但是所有元素只能使用一次

class Solution {
public:vector<vector<int>> res;int sum=0;vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {sort(candidates.begin(),candidates.end());//排序,让相同的元素挨到一起vector<int> track;backtrack(candidates,0,track,target);return res;}void backtrack(vector<int>& candidates,int start,vector<int>& track,int target){if(sum==target)//等于目标和,将该组合加入结果中{res.push_back(track);return;}if(sum>target)//超过目标和,直接结束{return;}for(int i=start;i<candidates.size();i++){//剪枝逻辑,值相同的相邻树枝,只遍历第一条(也就是i==start的那条)if(i>start&&candidates[i]==candidates[i-1]){continue;}track.push_back(candidates[i]);sum+=candidates[i];backtrack(candidates,i+1,track,target);track.pop_back();sum-=candidates[i];}}
};

二进制枚举子集 :

对于集合{0 , 1 , 2 , 3 , 4 , 5 , 6 },二进制(0101101)就代表子集{1,3,4,6},即二进制为0则不选中,为1则选中。对于n个数的集合,共有2^n种选择方案。

给定一个数组candidates,里面有n个互不相同的正整数,要从这n个正整数之中无重复地选取任意个数,使得选出的数的总和为target,共有多少种不同的选取方案。

int ans=0;
for(int i = 0; i < (1 << n); i++) //枚举所有的选择情况(2^n)
{int num = 0;for(int j = 0; j < n; j++)//查看0——n-1位的情况{if(i & (1 << j))//1为选中,0为未选中 {num += candidates[j];}}if(num == target) {ans++;}
}
return ans; 

39.组合总和

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

示例 1:

输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。

思路:

还是子集问题,candidate中无重复元素,所有元素可以无数次使用

backtrack(candidates , i , track);//进入下一层决策树,传i,使得元素可以重复使用

class Solution {
public:vector<vector<int>> res;int target;int sum=0;vector<vector<int>> combinationSum(vector<int>& candidates, int target) {this->target=target;vector<int> track;backtrack(candidates,0,track);return res;}void backtrack(vector<int>& candidates,int start,vector<int>& track){if(target==sum)//组合总和等于target,组合加入结果中,返回{res.push_back(track);return ;}if(sum>target)//组合总和大于target,直接返回{return ;}for(int i=start;i<candidates.size();i++){track.push_back(candidates[i]);sum+=candidates[i];backtrack(candidates,i,track);//进入下一层决策树,传i,使得元素可以重复使用track.pop_back();sum-=candidates[i];}}
};

784. 字母大小写全排列

给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。

返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。

示例 1:

输入:s = "a1b2"
输出:["a1b2", "a1B2", "A1b2", "A1B2"]

示例 2:

输入: s = "3z4"
输出: ["3z4","3Z4"]

 'a' ^ '  '= 'A' , 'A' ^ '  '= 'a' 

//回溯算法
class Solution {
public:vector<string> ans;vector<string> letterCasePermutation(string s) {string track;backtrack(s,0,track);return ans;}void backtrack(string& s,int pos,string& track){if(pos==s.size())//触发结束条件{ans.push_back(track);return ;}if((s[pos]>='a'&&s[pos]<='z')||(s[pos]>='A'&&s[pos]<='Z')){int choice[2]={0,32};for(int i=0;i<2;i++)//是字母,有两种选择,保持原样或大小写互转{//'a' ^ ' '= 'A' , 'A' ^ ' '= 'a' //因为'a'-'A'=32,' '==32,所以异或' '的目的是给小写字母加32,大写字母减32//也就是将二进制表示的第六位由0变1或者由1变0track.push_back(s[pos]^choice[i]);//做选择backtrack(s,pos+1,track);//进入下一层决策树track.pop_back();//撤销选择}}else//是数字,只有一种选择,保持原样{track.push_back(s[pos]);//做选择backtrack(s,pos+1,track);//进入下一层决策树track.pop_back();//撤销选择}}
};

77.组合 | 40.组合总和II | 39.组合总和 | 784.字母大小写全排列相关推荐

  1. 字母大小写全排列C语言,14种模式解决面试算法编程题(PART II)

    写在前面 8.树的宽度优先搜索(Tree BFS) 该模式基于广度优先搜索(BFS)技术来遍历树,并使用队列在跳到下一层之前记录下该层的所有节点.使用这种方法可以有效地解决涉及以逐级顺序遍历树的任何问 ...

  2. 组合系列--有排列就有组合

    文章目录 77. 组合 39. 组合总和 40. 组合总和 II 216. 组合总和 III 377. 组合总和 Ⅳ 组合的题目的重点就是顺序问题,他不像排列,不同顺序代表一个排列,所以组合的遍历.当 ...

  3. Suzy找到实习了吗 Day27 | 回溯进行中:39. 组合总和,40. 组合总和 II,131.分割回文串

    39. 组合总和 题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 , ...

  4. leetcode 39. 组合总和 40. 组合总和 II

    leetcode 39. 组合总和 40. 组合总和 II 组合总和 给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和 ...

  5. leetcode系列--40.组合总和 II

    leetcode系列–第40题.组合总和 II 给你一个由候选元素组成的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合 ...

  6. python两两组合求和_LeetCode-python 40.组合总和 II

    题目链接 难度:中等       类型: 深度优先搜索 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. ca ...

  7. LeetCode 40. 组合总和 II(排列组合 回溯)

    1. 题目 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只 ...

  8. 005. 组合总和 II

    1.题目链接: 40. 组合总和 II 2.解题思路: 树层:同层遍历 树枝:递归遍历 2.1.题目要求: 给定一个数组 candidates 和一个目标数 target ,找出 candidates ...

  9. ii 组合总和_40. 组合总和 II

    题目描述: 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只 ...

最新文章

  1. 如何清理由cmake生成的项目文件?
  2. Android监听安装卸载
  3. Jackson使用示例:将Java对象转换成Map
  4. Java图形开发--GUI
  5. OSPF NSSA 默认路由的问题
  6. os模块,os.path模块,subprocess模块,configparser模块,shutil模块
  7. PuTTY/PuttyGen创建密钥及利用密钥登录服务器
  8. IT行业的发展前景分析
  9. 评弱水三千,该取几瓢饮?———贪恋还是专情
  10. ElasticSearch读流程
  11. 制作AppStore预览:在 iPhone 上截屏或录制屏幕15秒以上的视频;iPhone日常使用技巧(一直弹出登录iCloud的解决方法、不自动弹出询问是否允许使用蜂窝数据的解决方法)
  12. win10自带磁盘测速工具
  13. 通达信版弘历软件指标_通达信获利分析仿弘历软件的六彩神龙指标公式-通达信公式...
  14. 安装Luma QQ (LINUX)
  15. Echarts折线图拐点突出显示效果
  16. 无脑三步走解决 The service already exists
  17. 洛谷P1365 WJMZBMR打osu 题解
  18. [运维] 高性能负载均衡集群
  19. php 操作word模板,phpword替换模板内容和解决中文乱码
  20. 【直播预告】3月17日从上云到云原生,如何用新技术应对突发事件

热门文章

  1. 三年磨一剑:蚂蚁金服的研发效能洞察实践
  2. 对智能电视的几个看法和观点
  3. 图标(Icon)和图标按钮(IconButton)
  4. 请查收 | 2022 阿里妈妈技术文章回顾
  5. CAD软件中如何统一文字字高?
  6. 又是一年叶落时(二)
  7. 笔记:STM32的ADC参考电压与参照电压(电源监测)
  8. java编程:放苹果
  9. 每个汉字在DB2数据库中占多少个字节?
  10. webuploader上传文件夹总结