zoukankan      html  css  js  c++  java
  • 39.Combination Sum

    给定一个数组,和一个目标值,求出用数组中的元素相加之和等于目标值得组合,数组中的数可以重复利用。

    Input: candidates = [2,3,5], target = 8,
    A solution set is:
    [
      [2,2,2,2],
      [2,3,3],
      [3,5]
    ]


    思路:
    由于数组中的元素可以重复利用,所以使用递归,让程序自己去找答案。每到一个位置,就将这个位置的target - candidates[i] ,而当candidates[i] > target时,表明后面没有解了,跳出循环,因为每一次target的值都在减小,所以就算无解,也会有跳出递归的结果。而当临时解为空时,表明没有找到解集,当其非空时,表明找到一组解,将解都遍历出来,在前面加上当前的 candidates[i],直到求出所有解。

    class Solution {
    public:
        vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
            vector<vector<int>> res;
            sort(candidates.begin(), candidates.end());
            int n = candidates.size();
            for (int i = 0; i < n; i++) {
                if (candidates[i] > target) break;
                if (candidates[i] == target) { res.push_back({ candidates[i] }); break; }
                vector<int> tmp(candidates.begin() + i, candidates.end());
                vector<vector<int>> tmp_res = combinationSum(tmp, target - candidates[i]);
                int tmp_res_len = tmp_res.size();
                for (int j = 0; j < tmp_res_len; j++) {
                    tmp_res[j].insert(tmp_res[j].begin(), candidates[i]);
                    res.push_back(tmp_res[j]);
                }
            }
            return res;
        }
    };

    Java 版:

    主要思想:进行递归遍历,全程用一个列表 / 队列,进行往里面加元素再递归,当满足条件时,加入最终答案集合,否则递归返回后,就将刚刚加入的元素弹出,不断的重复,可以加入一些剪枝判断。

    class Solution {
        public List<List<Integer>> combinationSum(int[] candidates, int target) {
            Arrays.sort(candidates);
            List<List<Integer>> res = new ArrayList<>();
            List<Integer> tmp = new ArrayList<>();
            this.combinationSumDFS(candidates, target, 0, tmp, res);
            return res;
        }
        public void combinationSumDFS(int[] candidates, int target, int begin, List<Integer> tmp, List<List<Integer>> res){
            if(target == 0){
                res.add(new ArrayList(tmp));
                return;
            }
            for(int i = begin; i < candidates.length; i++){
                if(target - candidates[i] < 0) break;
                tmp.add(candidates[i]);
                this.combinationSumDFS(candidates, target - candidates[i], i, tmp, res);
                if(tmp.size() > 0) tmp.remove(tmp.size() - 1);
            }
        }
    }
  • 相关阅读:
    JUnit测试框架使用
    Android开发环境搭建与SD card
    深入Java泛型(Java泛型擦除机制,使用泛型强转时机,擦除对复写影响,协变返回类型)
    DHTML5(控件动态效果综合应用与表单校验)
    DHTML4(select与checkbox应用)
    DHTML3(表格动态创建,删除行/列,表格行排序,行颜色交替高亮显示)
    DHTML2(window对象,下拉列表)
    DHTML1(节点操作)
    JavaScript_语法,语句,函数,对象
    Html/CSS2_了解CSS
  • 原文地址:https://www.cnblogs.com/luo-c/p/12964720.html
Copyright © 2011-2022 走看看