LeetCoding Challenge Oct. 2: Combination Sum

13050 단어 JavaLeetCodetech
리코드의 다음 날.
오늘은 Combination Sum입니다.

문제의 개요

  • 수조에서 제시한 여러 개의 수치를 각각 0회 이상 사용하고 합계치target의 수치의 조합을 모두 열거
  • 실시의 절차, 생각의 추이

  • 계산량을 줄이기 위해 동적 계획법을 사용해야 하는 문제인데...🤔
  • 회귀를 잠시 사용
  • 각 방법 호출 중 순환[index, candidates.length)의 범위, 사용candidates[i]의 수치 1회 이상
  • 귀속 호출 중 순환 범위[i + 1, candidates.length)

  • 준비candidate.length * target 크기의 배열(constraints보다 최대 1.5만)은 여기에 중간 캐시를 하면 되지 않습니까?
  • 시행 오류 →submit→accept🤗
  • 그러나runtime 28msYour runtime beats 5.80 % of java submissions.
  • 이건 너무해...🤮
  • 나는 가장 빈번한 값의 실행 시간의 코드 샘플을 보았지만 이것은 캐시가 아니라 순박한 실현이 더 빠르다.괴롭다
  • 코드


    @SuppressWarnings({"unchecked", "rawtypes"})
    class Solution {
        public List<List<Integer>> combinationSum(int[] candidates, int target) {
            return recursive(candidates, target, 0, 0, new List[candidates.length * target]);
        }
    
        List<List<Integer>> recursive(int[] candidates, final int target, final int index, final int sum, List[] cache) {
            if (sum >= target || index >= candidates.length) {
                return Collections.emptyList();
            }
    
            int cacheIndex = sum * candidates.length + index;
            List<List<Integer>> result = (List<List<Integer>>) cache[cacheIndex];
            if (result != null) {
                return result;
            }
    
            result = new ArrayList<>();
    
            for (int i = index; i < candidates.length; i++) {
                List<Integer> nums = new ArrayList<>(target);
                int c = candidates[i];
                int s = sum + c;
                nums.add(c);
    
                while (s < target) {
                    List<List<Integer>> recResult = recursive(candidates, target, i + 1, s, cache);
                    for (List<Integer> r : recResult) {
                        List<Integer> list = new ArrayList<>(nums.size() + r.size());
                        list.addAll(nums);
                        list.addAll(r);
                        result.add(list);
                    }
    
                    nums.add(c);
                    s += c;
                }
    
                if (s == target) {
                    result.add(nums);
                }
            }
    
            cache[cacheIndex] = result;
    
            return result;
        }
    }
    

    좋은 웹페이지 즐겨찾기