leetcode 40 조합수 총계 2

16478 단어 거슬러 올라가다
code
처음에는 이렇게 썼지만 중복되는 현상이 발견되어 수조를 정렬하고 거슬러 올라가는 과정에서 판단조건을 추가하여 무겁게 했다.
class Solution {
     

    List<List<Integer>> res = new ArrayList<>();
    boolean vis[];

    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
     
        vis = new boolean[candidates.length];
        List<Integer> path = new ArrayList<>();
        helper(0, target, candidates, path);
        return res;
    }

    private void helper(int id, int target, int[] nums, List<Integer> path){
     
        if (id == nums.length) return;
        if (target == 0){
     
            res.add(new ArrayList<>(path));
            return;
        }


        helper(id + 1, target, nums, path);

        if (target >= nums[id] && !vis[id]){
     
            vis[id] = true;
            path.add(nums[id]);
            helper(id, target - nums[id], nums, path);
            vis[id] = false;
            path.remove(path.size() - 1);
        }

    }
}


AC 코드가 앞의 값과 같고 앞의 값이 사용되지 않으면 현재 id를 선택하는 상황을 고려했기 때문에 건너뛸 수 있습니다.
class Solution {
     

    List<List<Integer>> res = new ArrayList<>();
    boolean vis[];

    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
     
        vis = new boolean[candidates.length];
        Arrays.sort(candidates);
        List<Integer> path = new ArrayList<>();
        helper(0, target, candidates, path);
        return res;
    }

    private void helper(int id, int target, int[] nums, List<Integer> path){
     
        if (id == nums.length) return;
        if (target == 0){
     
            res.add(new ArrayList<>(path));
            return;
        }

        if (id > 0 && nums[id] == nums[id - 1] && !vis[id - 1]){
     
            helper(id + 1, target, nums, path);
            return;
        }

        if (target >= nums[id] && !vis[id]){
     
            vis[id] = true;
            path.add(nums[id]);
            helper(id, target - nums[id], nums, path);
            vis[id] = false;
            path.remove(path.size() - 1);
        }
        helper(id + 1, target, nums, path);
    }
}

좋은 웹페이지 즐겨찾기