- Data Structure
- Networking
- RDBMS
- Operating System
- Java
- MS Excel
- iOS
- HTML
- CSS
- Android
- Python
- C Programming
- C++
- C#
- MongoDB
- MySQL
- Javascript
- PHP
- Physics
- Chemistry
- Biology
- Mathematics
- English
- Economics
- Psychology
- Social Studies
- Fashion Studies
- Legal Studies
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Largest Divisible Subset in C++
Suppose we have a set of distinct positive integers, we have to find the largest subset such that every pair like (Si, Sj) of elements in this subset satisfies: Si mod Sj = 0 or Sj mod Si = 0.
So if the input is like [1,2,3], the possible result may come like [1,2] or [1,3]
To solve this, we will follow these steps −
Create an array ret, set endpoint := 0, retLen := 1, n := size of nums
if n is 0, then return empty set
sort nums array
create two arrays len and par of size n, initialize len by 1, and par with 0
for i in range 1 to n – 1
par[i] := i
for j in range 0 to i – 1
if nums[i] mod nums[j] = 0 and len[j] + 1 > len[i], then
len[i] := len[j] + 1
par[i] := j
if len[j] > retLen, then retLen := len[i] and endpoint := i
insert nums[endPoint] into ret
while endpoint is not same as par[endPoint]
endpoint := par[endPoint]
insert nums[endPoint] into ret
reverse the list ret and return ret
Example(C++)
Let us see the following implementation to get better understanding −
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } class Solution { public: vector<int> largestDivisibleSubset(vector<int>& nums) { vector <int> ret; int endPoint = 0; int retLen = 1; int n = nums.size(); if(!n) return {}; sort(nums.begin(), nums.end()); vector <int> len(n, 1); vector <int> par(n, 0); for(int i = 1; i < n; i++){ par[i] = i; for(int j = 0; j < i; j++){ if(nums[i] % nums[j] == 0 && len[j] + 1 > len[i]){ len[i] = len[j] + 1; par[i] = j; } } if(len[i] > retLen){ retLen = len[i]; endPoint = i; } } ret.push_back(nums[endPoint]); while(endPoint != par[endPoint]){ endPoint = par[endPoint]; ret.push_back(nums[endPoint]); } reverse(ret.begin(), ret.end()); return ret; } }; main(){ Solution ob; vector<int> v = {1,2,3}; print_vector(ob.largestDivisibleSubset(v)); }
Input
[1,2,3]
Output
[1, 2, ]