Сложность: medium
Дан набор различных положительных целых чисел nums. Вернуть наибольшее подмножество answer, такое что каждая пара (answer[i], answer[j]) элементов в этом подмножестве удовлетворяет условию:
answer[i] % answer[j] == 0, или
answer[j] % answer[i] == 0
Если существует несколько решений, вернуть любое из них.
Пример:
Input: nums = [1,2,3]
Output: [1,2]
Explanation: [1,3] is also accepted.
👨💻 Алгоритм:
1⃣Если число 8 может быть разделено на элемент X_i, то добавив число 8 к EDS(X_i), мы получим еще одно делимое подмножество, которое заканчивается на 8, согласно нашему следствию I. И это новое подмножество является потенциальным значением для EDS(8). Например, поскольку 8 % 2 == 0, то {2,8} может быть конечным значением для EDS(8), и аналогично для подмножества {2,4,8}, полученного из EDS(4).
2⃣Если число 8 не может быть разделено на элемент X_i, то можно быть уверенным, что значение EDS(X_i) не повлияет на EDS(8), согласно определению делимого подмножества. Например, подмножество EDS(7)={7} не имеет влияния на EDS(8).
3⃣Затем мы выбираем наибольшие новые подмножества, которые мы формируем с помощью EDS(X_i). В частности, подмножество {8} является допустимым кандидатом для EDS(8). И в гипотетическом случае, когда 8 не может быть разделено ни на один из предыдущих элементов, мы бы имели EDS(8)={8}.
😎 Решение:
using System;
using System.Collections.Generic;
using System.Linq;
public class Solution {
public IList<int> LargestDivisibleSubset(int[] nums) {
int n = nums.Length;
if (n == 0) return new List<int>();
Array.Sort(nums);
List<List<int>> EDS = new List<List<int>>(new List<int>[n]);
for (int i = 0; i < n; i++) {
EDS[i] = new List<int>();
}
for (int i = 0; i < n; i++) {
List<int> maxSubset = new List<int>();
for (int k = 0; k < i; k++) {
if (nums[i] % nums[k] == 0 && maxSubset.Count < EDS[k].Count) {
maxSubset = EDS[k];
}
}
EDS[i] = new List<int>(maxSubset);
EDS[i].Add(nums[i]);
}
List<int> ret = new List<int>();
foreach (var subset in EDS) {
if (ret.Count < subset.Count) {
ret = subset;
}
}
return ret;
}
}
Ставь 👍 и забирай 📚 Базу знаний
