Leetcode 216) Combination Sum III

image

내 답안

  • 그림 그려서 생각해보기
class Solution {
    List<List<Integer>> res = new ArrayList<List<Integer>>();

    public List<List<Integer>> combinationSum3(int k, int n) {
        int check =0;
        for(int i =1;i<k+1;i++){
            check +=i;
        }
        //입밴하기
        if(check > n){
            return res;
        }
        //n에 남은 숫자 넣기?
        List<Integer> cur = new ArrayList<Integer>();
        bt(1,k,n,cur);
        return res;
    }

    public void bt(int ind , int left , int n, List<Integer> cur){
        if(n==0 && left==0){
            res.add(cur);
            return;}
        //몇자리 남았는데 left가 0이된 것, 여기서 걸러진다. 
        if(n<=0){
            return;}

        if(left==0){
            //없애버려야함...? 이렇게 하면 어차피 더이상 안 내려가니까 ㄱㅊ을거같은데?
            return;
        }

        for(int i =ind ; i<10;i++){
            List<Integer> tmp = new ArrayList<>(cur);
            tmp.add(i);
            if(n-i>=0){
                //여기서 중복 안 된 줄 알았는데? 아닌갑다?
                bt(i+1, left-1,n-i,tmp);
            }
        }
    }
}

다른 답안

class Solution {
    public List<List<Integer>> combinationSum3(int k, int n) {

        List<List<Integer>> result = new ArrayList<>();
        int[] candidates = new int[]{1,2,3,4,5,6,7,8,9};
        dfs(candidates, k, n, 0, new ArrayList<>(), result);

        return result;
    }

    private void dfs(int[] candidates, int k , int remaining, int start, List<Integer> temp, List<List<Integer>> res){
        if(temp.size() == k && remaining == 0){
            //we found k number to sum to n 
            res.add(new ArrayList<>(temp));
            return;
        }

        for(int i=start; i<candidates.length; i++){
            if(remaining-candidates[i]<0) break;
            temp.add(candidates[i]);
            dfs(candidates, k, remaining-candidates[i], i+1, temp, res);
            temp.remove(temp.size()-1);
        }
    }
}

오답

  • bt(ind+1 , left-1, n-i,tmp) 가 아니라 bt(i+1, left-1,n-i,tmp)다.
for(int i =ind ; i<10;i++){
    List<Integer> tmp = new ArrayList<>(cur);
    tmp.add(i);
    if(n-i>=0){
        //여기서 중복 안 된 줄 알았는데? 아닌갑다?
        bt(ind+1, left-1,n-i,tmp);
    }
}

© 2018. All rights reserved.

Powered by Hydejack v8.5.2