Let T[n] be the size of the largest divisible subset whose largest number is nums[n].
Let child[n] be the index of its child in the nums[n].
Now let's look at an example, nums = [1,2,3,4].
i = 0, j = 0, T = [1,0,0,0] child=[0,0,0,0]
i = 1, j = 1, T = [1,1,0,0] child=[0,1,0,0]
j = 0, T = [1,2,0,0] child=[0,0,0,0] (2's child is 1)
i = 2, j = 2, T = [1,2,1,0] child=[0,1,2,0]
j = 1, 3 can't be divided by 2, nothing to change
j = 0, T = [1,2,2,0] child=[0,0,0,0] (3's child is 1)
i = 3, j = 3, T = [1,2,2,1] child=[0,1,2,3]
j = 2, 4 can't be divided by 3, nothing to change
j = 1, T = [1,2,2,3] child=[0,1,2,1] (4's child is 2)
So far, the longest subset is 3. And we can find these three numbers by chasing the child[] array, i.e. nums[3]->nums[1]->nums[0] (i.e. 4,2,1). Therefore, in order to get the largest divisible subset, we can maintain the largest size of the subsets and the largest number's index in the set. The subset can be achieved by chasing the child[] array.
1: class Solution {
2: public:
3: vector<int> largestDivisibleSubset(vector<int>& nums) {
4: vector<int> res;
5: if (nums.size() == 0) return res;
6: vector<int> T(nums.size(), 0);
7: vector<int> child(nums.size(), 0);
8: int m = 0, mi = 0;
9: sort(nums.begin(), nums.end());
10: for (int i = 0; i < nums.size(); i++) {
11: for (int j = i; j >= 0; j--) {
12: if (nums[i] % nums[j] == 0 && T[j] + 1 > T[i]) {
13: T[i] = T[j] + 1;
14: child[i] = j;
15: }
16: if (T[i] > m) {
17: m = T[i];
18: mi = i;
19: }
20: }
21: }
22: for (int i = 0; i < m; i++) {
23: res.push_back(nums[mi]);
24: mi = child[mi];
25: }
26: return res;
27: }
28: };
No comments:
Post a Comment