题目
给出一个由无重复的正整数组成的集合,找出其中最大的整除子集,子集中任意一对 (Si,Sj) 都要满足:Si % Sj = 0 或 Sj % Si = 0。
如果有多个目标子集,返回其中任何一个均可。
示例 1:
输入: [1,2,3] 输出: [1,2] (当然, [1,3] 也正确)
示例 2:
输入: [1,2,4,8] 输出: [1,2,4,8]
解法
class Solution {
public List<Integer> largestDivisibleSubset(int[] nums) {
Arrays.sort(nums);
List<Integer> list = new ArrayList<>();
check(nums,0, list,new ArrayList<>());
return list;
}
private void check(int[] nums, int index, List<Integer> list, List<Integer> choose){
//剩余可选的数字数量就算全部符合也不大于当前最大整除子集的长度,故可返回
if(nums.length - index + choose.size() <= list.size()){
return;
}
for(int i = index; i < nums.length; i++){
if(choose.isEmpty()){
choose.add(nums[i]);
check(nums,i+1,list,choose);
choose.remove(choose.size()-1);
}else{
//由于已经升序排序过,只需要判断最后一位数n是否满足nums[i] % n = 0
if(nums[i] % choose.get(choose.size()-1) == 0){
choose.add(nums[i]);
check(nums,i+1,list,choose);
choose.remove(choose.size()-1);
}
}
}
if(choose.size() > list.size()){
list.clear();
list.addAll(choose);
}
}
}