90 k数和 II 数据结构和算法总结(一):广度优先搜索BFS和深度优先搜索DFS

原题网址: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=2, target=5,返回 [[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=0;
    dfsn(A,k,targer,sum,0,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+1,cur,result);
    cur.pop_back();//去掉A[ind];
    dfsn(A,k,targer,sum,ind+1,cur,result);
}
};
 
参考:
lintcode----k数和II    讲解稍微详细一些
[LintCode] k Sum II [Backtracking]  另一种实现方式
 

 

猜你喜欢

转载自www.cnblogs.com/Tang-tangt/p/9319849.html