classSolution{public:vector<int>largestDivisibleSubset(vector<int>&nums){constintn=nums.size();vector<int>ans;// sizeEndsAt[i] := largest size ends at nums[i]vector<int>sizeEndsAt(n,1);// prevIndex[i] := the best index s.t.// 1. nums[i] % nums[prevIndex[i]] == 0 and// 2. can increase the size of the subsetvector<int>prevIndex(n,-1);intmaxSize=0;// Max size of the subsetintindex=-1;// Track the best ending indexsort(begin(nums),end(nums));// Fix max ending num in the subset firstfor(inti=0;i<n;++i){for(intj=i-1;j>=0;--j)if(nums[i]%nums[j]==0&&sizeEndsAt[i]<sizeEndsAt[j]+1){sizeEndsAt[i]=sizeEndsAt[j]+1;prevIndex[i]=j;}// Find a new subset that has a bigger sizeif(maxSize<sizeEndsAt[i]){maxSize=sizeEndsAt[i];index=i;// Update the best ending index}}// Loop from back to frontwhile(index!=-1){ans.push_back(nums[index]);index=prevIndex[index];}returnans;}};
classSolution{publicList<Integer>largestDivisibleSubset(int[]nums){finalintn=nums.length;List<Integer>ans=newArrayList<>();// sizeEndsAt[i] := largest size ends at nums[i]int[]sizeEndsAt=newint[n];// prevIndex[i] := the best index s.t.// 1. nums[i] % nums[prevIndex[i]] == 0 and// 2. can increase the size of the subsetint[]prevIndex=newint[n];intmaxSize=0;// Max size of the subsetintindex=-1;// Track the best ending indexArrays.fill(sizeEndsAt,1);Arrays.fill(prevIndex,-1);Arrays.sort(nums);// Fix max ending num in the subset firstfor(inti=0;i<n;++i){for(intj=i-1;j>=0;--j)if(nums[i]%nums[j]==0&&sizeEndsAt[i]<sizeEndsAt[j]+1){sizeEndsAt[i]=sizeEndsAt[j]+1;prevIndex[i]=j;}// Find a new subset that has a bigger sizeif(maxSize<sizeEndsAt[i]){maxSize=sizeEndsAt[i];index=i;// Update the best ending index}}// Loop from back to frontwhile(index!=-1){ans.add(nums[index]);index=prevIndex[index];}returnans;}}