LeetCoding Challenge Oct. 2: Combination Sum
오늘은 Combination Sum입니다.
문제의 개요
target
의 수치의 조합을 모두 열거실시의 절차, 생각의 추이
[index, candidates.length)
의 범위, 사용candidates[i]
의 수치 1회 이상[i + 1, candidates.length)
준비
candidate.length * target
크기의 배열(constraints보다 최대 1.5만)은 여기에 중간 캐시를 하면 되지 않습니까?Your 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;
}
}
Reference
이 문제에 관하여(LeetCoding Challenge Oct. 2: Combination Sum), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/komiya_atsushi/articles/c295a52e69650ee6b3e7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)