zoukankan      html  css  js  c++  java
  • 组合数组合

    一、给定一个无重复元素的数组和一个目标数target,找出数组中所有可以使数字和为target的组合

    递归回溯法,通过排序来去重。

    数组中的数字可以无限制重复被选取。

    说明:

    • 所有数字(包括 target)都是正整数。
    • 解集不能包含重复的组合。 
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    class Solution {
        public List<List<Integer>> combinationSum(int[] candidates, int target) {
            List<List<Integer>> result = new ArrayList<List<Integer>>();
            List<Integer> temp = new ArrayList<>();
            Arrays.sort(candidates);
            wuCombinationSumTemp(candidates,target,result,temp,0);
            return result;
        }
        public static void wuCombinationSumTemp(int[] candidates, int target,List<List<Integer>> result, List<Integer> temp,int index) {
            if(target<0) {
                return;
            }
            if(target==0) {
                List<Integer> list = new ArrayList<>(temp);
                result.add(list);
                return;
            }
            int len = candidates.length;
            int tempLen = temp.size();
            for(int i=index;i<len;i++) {
                temp.add(candidates[i]);
                wuCombinationSumTemp(candidates, target-candidates[i],result,temp,i);
                temp.remove(tempLen);
            }
            return;
        }
    }

    二、给定一个数组和一个目标数target,找出数组中所有可以使数字和为target的组合

    数组中的每个数字在每个组合中只能使用一次。

    说明:

      所有数字(包括目标数)都是正整数。
      解集不能包含重复的组合。 

    这里的解题思想主要是动态规划的思想,然后还有很重要的一点就是这里的去重的方法。

    class Solution {
        public List<List<Integer>> combinationSum2(int[] candidates, int target) {
            Arrays.sort(candidates);
            List<List<Integer>> result = null;
            result = zuhe(candidates,target,candidates.length);
            return result;
        }
        public static List<List<Integer>> zuhe(int[] candidates, int target,int len) {
            List<List<Integer>> result = new ArrayList<>();
            List<List<Integer>> temp = null;
            if(len == 0){
                if(target==0) {
                    List<Integer> list = new ArrayList<Integer>(); 
                    result.add(list);
                }
                return result;
            }else{
                if(target<0){
                    return result;
                }
                if(target==0){
                    List<Integer> list = new ArrayList<Integer>();   
                    result.add(list);
                    return result;
                }
                int k = 0;
                if(len!=1){
                    for(int i=len-2;i>=0;i--){
                        if(candidates[i]!=candidates[len-1]){
                            k = i+1;
                            break;
                        }
                    } 
                }
                for(int i=k;i<=len;i++){
                    temp = zuhe(candidates, target-candidates[len-1]*(i-k),k);
                    for(List<Integer> list:temp){
                        for(int j=k;j<i;j++){
                            list.add(candidates[len-1]);
                        }
                    }
                    result.addAll(temp);
                }
                return result;
            }
        }
    }
  • 相关阅读:
    jvm 垃圾回收
    shell编写一键启动
    jvm内存结构
    java 线程监控
    linux 操作系统级别监控 nmon命令
    linux 操作系统级别监控 vmstat/dstat 命令
    linux 操作系统级别监控 df 命令
    linux 操作系统级别监控 iostat 命令
    linux 操作系统级别监控 free命令
    linux 操作系统级别监控 TOP命令
  • 原文地址:https://www.cnblogs.com/erdanyang/p/11039378.html
Copyright © 2011-2022 走看看