From 9cc50f4df81f0a3c2c8627d1a29c7909bf00785e Mon Sep 17 00:00:00 2001 From: Fazeel Usmani Date: Mon, 15 Nov 2021 22:51:59 +0530 Subject: [PATCH] Create 15_largestDIvisibleSubset.cpp --- .../15_largestDIvisibleSubset.cpp | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 11 November Leetcode Challenge 2021/15_largestDIvisibleSubset.cpp diff --git a/11 November Leetcode Challenge 2021/15_largestDIvisibleSubset.cpp b/11 November Leetcode Challenge 2021/15_largestDIvisibleSubset.cpp new file mode 100644 index 0000000..9bc3f7f --- /dev/null +++ b/11 November Leetcode Challenge 2021/15_largestDIvisibleSubset.cpp @@ -0,0 +1,22 @@ +class Solution { +public: + vector largestDivisibleSubset(vector& nums) { + sort(begin(nums), end(nums)); + int n = size(nums), max_i = 0; + // initially dp[i]=1 since we can always form subset of size=1 ending at i. + // pred[i]=-1 because we havent found any predecessors for any subset yet + vector dp(n, 1), pred(n, -1), ans; + for(int i = 1; i < n; i++) { + for(int j = 0; j < i; j++) + // nums[i] should divide nums[j] if it is to be included in its subset (i.e dp[j]) + // only include nums[i] in subset ending at j if resultant subset size (dp[j]+1) is larger than already possible (dp[i]) + if(nums[i] % nums[j] == 0 && dp[i] < dp[j]+1) + dp[i] = dp[j]+1, pred[i] = j; // jth element will be predecessor to subset ending at ith element + if(dp[i] > dp[max_i]) max_i = i; // keep track of index where largest subset ends + } + // start with index where largest subset ended. Reconstruct from that point to the start + for(; max_i >= 0; max_i = pred[max_i]) + ans.push_back(nums[max_i]); + return ans; + } +};