Largest Divisible Subset问题及解法

来源:互联网 发布:2016嘉兴菜鸟网络招聘 编辑:程序博客网 时间:2024/06/08 08:50

问题描述:

Given a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of elements in this subset satisfies: Si % Sj = 0 or Sj% Si = 0.

If there are multiple solutions, return any subset is fine.

示例:

nums: [1,2,3]Result: [1,2] (of course, [1,3] will also be ok)
nums: [1,2,4,8]Result: [1,2,4,8]

问题分析:

题目要求最长的子集和,于是我们可以设置一个长度的转移数组T,对于升序排序的数组nums来讲,T[i] = max(T[i],1+T[j]),T[i]表示以nums[i]为最大元素的子集和长度。这里还有一个小技巧就是记录了最长子集和元素之间的前后关系(pre数组)。


过程详见代码:

class Solution {public:vector<int> largestDivisibleSubset(vector<int>& nums) {sort(nums.begin(), nums.end());vector<int> T(nums.size(), 1);vector<int> pre(nums.size(), 0);int m = 0;int mi = 0;for (int i = 0; i < nums.size(); ++i){for (int j = i - 1; j >= 0; --j){if (nums[i] % nums[j] == 0 && T[i] < 1 + T[j]){T[i] = 1 + T[j];pre[i] = j;}}if (T[i] > m){m = T[i];mi = i;}}vector<int> ret;for (int i = 0; i < m; ++i){ret.push_back(nums[mi]);mi = pre[mi];}return ret;}};



原创粉丝点击