原题网址:https://www.lintcode.com/problem/k-sum-ii/description

描述

Given n unique integers, number k (1<=k<=n) and target.

Find all possible k integers where their sum is target.

您在真实的面试中是否遇到过这个题?  是

样例

给出[1,2,3,4],k=, target=,返回 [[1,4],[2,3]]

标签
LintCode 版权所有
Depth-first Search(DFS)
 
 
思路:深度优先搜索(DFS是一个递归的过程)。
创建递归函数,从原数组起始位置开始搜索,每个元素都有两种情况,拿或者不拿。
递归搜索终止条件为:
1.若拿到的元素个数等于K且元素的和等于target,说明找到一组解,将其push到结果数组中;
2.搜索指针超出原数组下标范围;
3.拿到元素的个数大于等于K且元素的和不为target或者元素的和已经大于target,结束当前搜索。(剪枝?)
 
 
 AC代码:
class Solution {
public:
/*
* @param A: an integer array
* @param k: a postive integer <= length(A)
* @param target: an integer
* @return: A list of lists of integer
*/
vector<vector<int>> kSumII(vector<int> &A, int k, int targer) {
// write your code here
vector<vector<int>> result;
vector<int> cur;
int sum=;
dfsn(A,k,targer,sum,,cur,result);
return result;
} void dfsn(vector<int> &A, int k, int targer,int sum,int ind,vector<int> cur ,vector<vector<int>> &result)
{
if (cur.size()==k&&sum==targer)
{
result.push_back(cur);
return ;
}
if (ind>=(int)A.size())
{
return ;
}
if (cur.size()>=k||sum>targer)
{
return ;
}
cur.push_back(A[ind]);
dfsn(A,k,targer,sum+A[ind],ind+,cur,result);
cur.pop_back();//去掉A[ind];
dfsn(A,k,targer,sum,ind+,cur,result);
}
}; 

PS:从第一个元素开始,依次拿走K个元素组成cur,每个元素只有两种情况,当前被拿到、当前没被拿到,这样就可以找到所有K个数的组合。K数和为target就push到结果中,否则废弃。

进一步剪枝优化时间复杂度,若拿到的元素和已经超过了target,可以直接废弃当前的组合。

 
参考:
lintcode----k数和II    讲解稍微详细一些
[LintCode] k Sum II [Backtracking]  另一种实现方式
 
 
另一种AC代码:
class Solution {
public:
/*
* @param A: an integer array
* @param k: a postive integer <= length(A)
* @param target: an integer
* @return: A list of lists of integer
*/
vector<vector<int>> kSumII(vector<int> &A, int k, int targer) {
// write your code here
vector<vector<int>> result;
vector<int> cur;
int sum=;
findk(A,k,targer,sum,,cur,result);
return result;
} void findk(vector<int> &A, int k, int targer,int sum,int ind,vector<int> cur ,vector<vector<int>> &result)
{
if (cur.size()==k&&sum==targer)
{
result.push_back(cur);
return ;
}
if ((int)cur.size()>=k||sum>targer)
{
return ;
} for (int i=ind;i<(int)A.size();i++)
{
cur.push_back(A[i]);
findk(A,k,targer,sum+A[i],i+,cur,result);//注意是i+1不是ind+1;
cur.pop_back();
}
}
};

90 k数和 II的更多相关文章

  1. lintcode 中等题:k Sum ii k数和 II

    题目: k数和 II 给定n个不同的正整数,整数k(1<= k <= n)以及一个目标数字. 在这n个数里面找出K个数,使得这K个数的和等于目标数字,你需要找出所有满足要求的方案. 样例 ...

  2. Leetcode 454.四数相加II

    四数相加II 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0. 为了使问题简单 ...

  3. Java实现 LeetCode 454 四数相加 II

    454. 四数相加 II 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0. 为 ...

  4. 【哈希表】leetcode454——四数相加II

    编号454:四数相加II 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0. 为 ...

  5. 代码随想录第七天| 454.四数相加II、383. 赎金信 、15. 三数之和 、18. 四数之和

    第一题454.四数相加II 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, ...

  6. lintcode: 三数之和II

    题目 三数之和 II 给一个包含n个整数的数组S, 找到和与给定整数target最接近的三元组,返回这三个数的和. 样例 例如S = .  和最接近1的三元组是 -1 + 2 + 1 = 2. 注意 ...

  7. lintcode-464-整数排序 II

    464-整数排序 II 给一组整数,按照升序排序.使用归并排序,快速排序,堆排序或者任何其他 O(n log n) 的排序算法. 样例 给出 [3, 2, 1, 4, 5], 排序后的结果为 [1, ...

  8. 【洛谷P1288】取数游戏II

    取数游戏II 题目链接 显然,由于一定有一个0,我们可以求出从初始点到0的链的长度 若有一条链长为奇数,则先手可以每次取完一条边上所有的数, 后手只能取另一条边的数,先手必胜: 反之若没有奇数链,后手 ...

  9. [LeetCode]Median of Two Sorted Arrays 二分查找两个有序数组的第k数(中位数)

    二分.情况讨论 因为数组有序,所以能够考虑用二分.通过二分剔除掉肯定不是第k位数的区间.如果数组A和B当前处理的下标各自是mid1和mid2.则 1.假设A[mid1]<B[mid2], ①.若 ...

随机推荐

  1. DP杂题2

    1.邦邦的大合唱站队 https://www.luogu.org/problem/show?pid=3694 XY说这是道简单的签到题,然后我大概是普及组都拿不到三等的那种了.. 插入题解.写得太好了 ...

  2. (转)SQL盲注攻击的简单介绍

    转:http://hi.baidu.com/duwang1104/item/65a6603056aee780c3cf2968 1 简介     1.1 普通SQL注入技术概述     目前没有对SQL ...

  3. day 53 Django基础二之URL路由系统

    Django基础二之URL路由系统   本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11 ...

  4. [PKUSC2018]神仙的游戏

    题目 画一画就会发现一些奇诡的性质 首先如果\(len\)为一个\(\operatorname{border}\),那么必然对于\(\forall i\in [1,len]\),都会有\(s_i=s_ ...

  5. 牛客暑期第六场G /// 树形DP 最大流最小割定理

    题目大意: 输入t,t个测试用例 每个测试用例输入n 接下来n行 输入u,v,w,树的无向边u点到v点权重为w 求任意两点间的最大流的总和 1.最大流最小割定理 即最大流等于最小割 2.无向树上的任意 ...

  6. 纵览轻量化卷积神经网络:SqueezeNet、MobileNet、ShuffleNet、Xception

    近年提出的四个轻量化模型进行学习和对比,四个模型分别是:SqueezeNet.MobileNet.ShuffleNet.Xception. SqueezeNet https://arxiv.org/p ...

  7. mysql之备份表和备份数据库

    备份表 1.首先创建一个与原来一样的表 create table score2 like score; ###like就是将score表的结构拷贝过来,但是它并不执行数据:也就是说执行完上面的语句之后 ...

  8. 【JZOJ3400】旅行

    description 从前有一位旅者,他想要游遍天下所有的景点.这一天他来到了一个神奇的王国:在这片土地上,有n个城市,从1到n进行编号.王国中有m条道路,第i条道路连接着两个城市ai,bi,由于年 ...

  9. HZOI20190725 B 回家 tarjan

    题目大意:https://www.cnblogs.com/Juve/articles/11226266.html 题解: 感觉挺水的,但考场上没打出来 题目翻译一下就是输出起点到终点必经的点 其实就是 ...

  10. 数论,质因数,gcd——cf1033D 好题!

    直接筛质数肯定是不行的 用map<ll,ll>来保存质因子的指数 考虑只有3-5个因子的数的组成情况 必定是a=pq or a=p*p or a=p*p*p or a=p*p*p*p 先用 ...