Leetcode #39. Combination Sum 조합 구문 및 문제 풀이 보고서

1 문제 풀이 사상


원제는 몇 개의 숫자와 하나의 목표 값을 정하고 이 숫자들 중에서 몇 개를 골라 합치면 그의 합은 목표 값과 딱 같고 그 중 한 개의 숫자는 여러 번 선택할 수 있다는 것이다.출력을 요구하는 것은 중복될 수 없고 그룹 내의 순서는 내림차순으로 할 수 없습니다.
이 문제는 우선 반드시 생각해야 할 것이 정렬이다. 정렬은 매우 기본적이고 자주 사용하는 조작이다.
그리고 우리는 중복을 배제해야 한다. (한 수를 중복해서 선택할 수 있으므로 중복은 먼저 없애는 것이 가장 좋다. 왜냐하면 우리는 역추적을 해야 하기 때문이다. 이렇게 하면 무의미한 비용을 낮출 수 있기 때문이다.)
그 다음에 우리는 해답을 구하기 시작했다. 해답을 구하는 방법은 귀속의 거슬러 올라가는 것이다. 매번 귀속 전달에 필요한 수치reserve를 사용하고 이미 선택한 숫자를 기록하는 것이다. 원칙적으로 현재 선택한 숫자는 이전보다 크기 때문에 index는 어느 색인부터 선택할 수 있는지 표시한다.
그리고reserve가 0이면 최종 결과에 가입하고, 못 만나면 추가하지 않습니다~~

2 원제


Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
•All numbers (including target) will be positive integers. •Elements in a combination (a1, a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak). •The solution set must not contain duplicate combinations.
For example, given candidate set 2,3,6,7 and target 7, A solution set is: [7] [2, 2, 3]

3 AC 해제

public class Solution {
    /** *  , , reserve=0 list * **/
    int n;
    int nums[];
    List<List<Integer>> result;
    // , , 
    public void find(List<Integer> values,int index,int reserve){
        if(reserve==0){
            ArrayList<Integer> item=new ArrayList<Integer>();
            item.addAll(values);
            result.add(item);
        }
        for(int i=index;i<n;i++){
            if(nums[i]<=reserve){
                values.add(nums[i]);
                find(values,i,reserve-nums[i]);
                values.remove(values.size()-1);
            }
        }
    }
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        // 
        Arrays.sort(candidates);
        // , 
        int i,j,k,n;
        n=1;
        for(i=1;i<candidates.length;i++){
           if(candidates[i]!=candidates[i-1]){
               candidates[n++]=candidates[i];
           } 
        }
        this.nums=candidates;
        this.n=n;
        this.result=new ArrayList<List<Integer>>();
        find(new ArrayList<Integer>(),0,target);
        return this.result;


    }
}

좋은 웹페이지 즐겨찾기