分治法解决组合总和问题(leetcode216)
nums数组中元素是正整数
大问题转换为小问题
思路和分治法解决组合相同,代码也相似
分治法解决组合问题(递归)_m0_52043808的博客-CSDN博客
只不过递归出口时需要判断组合总和是否为n
在调用递归函数时,n需要变小
递归出口
(1)如果k=1,则可以直接写出数组的所有满足值为n组合(每个元素都是一个组合)
(2)如果数组的个数等于k,如果数组所有元素之和为n,组合就是nums本身
解释:k在递归过程中不断减少,数组的个数在递归过程中不断减少,当减少到以上两种情况时,所有的组合情况可以直接写出来
剪枝函数
n在递归过程不断变小,当n<0时,说明之后的数不存在组合
代码
vector<vector<int>> combine(vector<int>&nums, int k,int n) {vector<vector<int>>res;if (n < 0){return res;}if (nums.size() == k){int sum=0;for (int i = 0; i < nums.size(); i++){sum += nums[i];}if (sum == n){res.push_back(nums);}return res;}if (k == 1){vector<int>temp;for (int i = 0; i < nums.size(); i++){if (nums[i] == n){temp.push_back(nums[i]);res.push_back(temp);temp.pop_back();}}return res;}vector<vector<int>>ans;for (int i = 0; i < nums.size() - k+1; i++){vector<vector<int>>temp;vector<int>n_nums(nums.begin() + i+1, nums.end());temp= combine(n_nums, k - 1,n-nums[i]);vector<int>single;single.push_back(nums[i]);for (int j = 0; j < temp.size(); j++){temp[j].insert(temp[j].end(), single.begin( ), single.end());}for (int i = 0; i < temp.size(); i++){ans.push_back(temp[i]);}}return ans;}
分治法解决组合总和问题(leetcode216)相关推荐
- 分治法解决组合问题(递归)
大问题转换为小问题 求nums数组中k个数的所有组合,只要确定第一个数, 问题转化为求第一个数之后的数组k-1个数的所有组合,然后在这些组合里加上第一个数 递归出口: (1)如果k=1,则可以直接写出 ...
- 分治法解决最大子数组问题
分治法解决最大子数组问题 参考文章: (1)分治法解决最大子数组问题 (2)https://www.cnblogs.com/Christal-R/p/Christal_R.html (3)https: ...
- 分治法解决循环赛日程表
分治法解决循环赛日程表 问题描述 设有n=2^k个运动员要进行羽毛球循环赛,现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次. (2)每个选手一天只能比赛一次. ( ...
- 分治法解决矩阵乘法问题
分治法解决矩阵乘法问题 传统for循环: #include<iostream> #include<cstdio> #include <vector> #includ ...
- 分治法解决棋盘覆盖问题
分治法解决棋盘覆盖问题 问题描述: 在一个2k×2k(k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格.显然,特殊方格在棋盘中出现的位置有4k中情形,因而有4k中不同的棋盘. ...
- 分治法解决最小套圈问题
/* Copyright by ZhongMing-Bian Jan,6,2010 */ /* 分治法解决最小套圈问题 ...
- 分治法解决最近点对问题
问题 给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的距离最小.严格地说,最接近点对可能多于1对.为了简单起见,这里只限于找其中的一对. 原理(这段为抄袭https://blog. ...
- 分治法解决计算凸包问题
清华大学的邓俊辉老师的<计算几何>公开课中,在计算凸包问题时会遇到极点法和极边法: 极点法是假设所有的点都是凸包上的点,然后根据In-triangle测试,把去除不是极点的点,时间复杂度是 ...
- 蛮力法与分治法解决最近点对问题-详细分析与C++代码实现
最近点对问题 最近点对问题の目录 最近点对问题 什么是最近点对问题 代码基本框架 蛮力法及其代码 分治法及其代码 一般分治法遇到的特殊情况 如何优化分治法(6点确定与4点确定解法) 优化后分治法(4点 ...
最新文章
- Spring MVC常用注解说明
- Ruby 三元一次线性方程组
- 错误日志类-也可以用于查看输出结构
- wxWidgets:wxMiniFrame类用法
- 用python实现yale人脸数据集降维_用Python实现磁盘IO操作全攻略,让数据流动起来!...
- python画图中grid等于true_python – 散布在GridPlot中覆盖多个绘图对象
- 21天Jenkins打卡day8-配置SSH远程服务器
- 解决chrome崩溃的方法
- C# 子类实例化基类 基类使用不了子类的方法_C#委托事件机制:事件的完整声明,触发和事件的本质(6)...
- 特征的标准化和归一化
- ZBrush如何结合数位板雕刻模型
- 每日工作记录——状态机的编码选择
- Babylonjs 官网demo预览图合集整理 带说明
- 出现窗口:CMD提示应用程序错误
- 给图片添加文字(换行)水印
- Java学习简单画椭圆
- 动画骨骼【Visual C++】游戏开发五十二 浅墨DirectX教程二十 骨骼动画来袭(一)...
- 【神经网络与深度学习】 Numpy 实现全连接神经网络
- 使用ffmpeg 命令行解码并显示像素格式为.raw图像
- 电子科技大学-高级计算机系统结构
热门文章
- POJ 2983 Is the Information Reliable?(差分约束系统)
- XPath学习:轴(4)——ancestor
- Interesting Finds: 2008.04.06
- QT5.14在Win10和Win7下的安装
- UVA785 LA5281 Grid Colouring【DFS】
- Bailian4019 黑色星期五【模拟】
- 《程序设计技术》第三章例程
- HDU1465 不容易系列之一【递推】
- UVA10165 Stone Game【Nim游戏】
- python tricks —— datetime 删除日期中的前导 0