Leetcode Java Subsets II
업데이트:
문제
코드
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> result = new ArrayList<>();
this.recursive(result, new ArrayList<>(), nums, 0);
return result;
}
private void recursive(List<List<Integer>> result, List<Integer> temp, int[] nums, int start) {
result.add(new ArrayList<>(temp));
for (int idx = start; idx < nums.length; idx++) {
if (idx > start && nums[idx] == nums[idx - 1]) {
continue;
}
temp.add(nums[idx]);
this.recursive(result, temp, nums, idx + 1);
temp.remove(temp.size() - 1);
}
}
}
결과
설명
-
정렬되지 않은 주어진 배열 nums 안의 값들을 이용하여 중복되지 않은 부분 배열들을 만드는 문제이다.
-
중복된 부분 배열 생성을 사전에 방지하기 위해서 nums를 오름차순으로 정렬한다.
- 부분 배열들을 넣을 result 변수를 선언하고, 재귀 호출을 통해 부분 배열을 만들어 넣어준다.
- 부분 배열을 만드는 temp를 새 ArrayList 객체로 생성하여 result에 넣어준다.
- 전달받은 start부터 nums의 길이 미만까지 반복을 통해 부분 배열을 생성한다.
- idx가 start보다 크고 nums[idx]와 nums[idx - 1]의 값이 동일한 경우, 중복된 값이므로 무시하고 반복을 계속 한다.
- 위의 경우가 아닌 경우 temp에 nums[idx]를 넣고 start에 idx + 1 값을 넣어 재귀 호출을 수행한다.
- 재귀 호출이 끝나면 temp의 마지막 값을 제거하고 반복을 계속 한다.
- 재귀 호출이 완료되면 중복되지 않은 부분 배열들을 저장한 result를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기