zoukankan      html  css  js  c++  java
  • 90 k数和 II

    原题网址: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);
    }
    }; 

     

    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=0;
        findk(A,k,targer,sum,0,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+1,cur,result);//注意是i+1不是ind+1;
            cur.pop_back();
        }
    }
    };

     

  • 相关阅读:
    数据结构之双向链表
    数据结构入门之链表(C语言实现)
    机器人操作臂运动学入门一--D-H参数标定
    机器学习--逻辑回归
    python字符串方法的简单使用
    python学习之网页数据获取
    《机器学习实战》学习笔记一K邻近算法
    杂事
    洛谷 P1926 小书童——刷题大军
    洛谷 P1968 美元汇率
  • 原文地址:https://www.cnblogs.com/Tang-tangt/p/9319849.html
Copyright © 2011-2022 走看看