Проблема заключается в том, что «данный список чисел, которые могут содержать дубликаты, возвращает все возможные подмножества (набор мощности).
Набор решений не должен содержать повторяющихся подмножеств. Верните решение в любом порядке».
У меня есть простой код, чтобы использовать похожие способы решения этой проблемы. Однако подход Hashset не работает для некоторых тестовых случаев, таких как [10, 10, 1, 2, 2, 2, 10]. Но подход сортировки и сравнения целых чисел работает.
Это просто отличается от перестановки.
Этот код работает:
import java.util.*;
public class test {
static ArrayList<ArrayList<Integer>> subsets_with_duplicate(ArrayList<Integer> numbers) {
ArrayList<ArrayList<Integer>> res=new ArrayList<>();
Collections.sort(numbers);
helper(res, new ArrayList<>(), numbers, 0);
return res;
}
static void helper(ArrayList<ArrayList<Integer>> res, ArrayList<Integer> slate, ArrayList<Integer> numbers, int pos){
int n=numbers.size();
res.add(new ArrayList<Integer>(slate));
//Set<Integer> set=new HashSet<>();
for(int i=pos; i<n; i++){
//if (!set.add(numbers.get(i)))
if (i!=pos&&numbers.get(i).equals(numbers.get(i-1)))
continue;
slate.add(numbers.get(i));
helper(res, slate, numbers, i+1);
slate.remove(slate.size()-1);
}
}
// Driver code
public static void main(String args[])
{
ArrayList<Integer> arr= new ArrayList<>(Arrays.asList(10, 10, 1, 2, 2, 2, 10));
for(var v:subsets_with_duplicate(arr)){
System.out.println(v);
}
}
}
Этот код не работает -
import java.util.*;
public class test {
static ArrayList<ArrayList<Integer>> subsets_with_duplicate(ArrayList<Integer> numbers) {
ArrayList<ArrayList<Integer>> res=new ArrayList<>();
//Collections.sort(numbers);
helper(res, new ArrayList<>(), numbers, 0);
return res;
}
static void helper(ArrayList<ArrayList<Integer>> res, ArrayList<Integer> slate, ArrayList<Integer> numbers, int pos){
int n=numbers.size();
res.add(new ArrayList<Integer>(slate));
Set<Integer> set=new HashSet<>();
for(int i=pos; i<n; i++){
if (!set.add(numbers.get(i)))
//if (i!=pos&&numbers.get(i).equals(numbers.get(i-1)))
continue;
slate.add(numbers.get(i));
helper(res, slate, numbers, i+1);
slate.remove(slate.size()-1);
}
}
// Driver code
public static void main(String args[])
{
ArrayList<Integer> arr= new ArrayList<>(Arrays.asList(10, 10, 1, 2, 2, 2, 10));
for(var v:subsets_with_duplicate(arr)){
System.out.println(v);
}
}
}
Почему?
Разница в частичном выходе между этими двумя решениями выделена красным.
@LouisWasserman вот силовой набор. Целочисленные элементы могут иметь одинаковое значение, но они не совпадают.
@LouisWasserman Думаю, вы напоминаете мне, почему использование hashset не работает, поскольку hashset фильтрует элементы с одинаковыми значениями. Но я все еще не понимаю, почему решение hashset имеет больше выходов.
Каждый вызов helper создает новый набор, поэтому вы получаете уникальный результат только в рамках одного вызова helper.




Вам не хватает Collections.sort(numbers); в вашей последней программе. Если вы раскомментируете, он покажет тот же результат, что и раньше. Потому что без кода HashSet вы сортируете данные, но не во второй программе.
static ArrayList<ArrayList<Integer>> subsets_with_duplicate(ArrayList<Integer> numbers) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
Collections.sort(numbers);
helper(res, new ArrayList<>(), numbers, 0);
return res;
}
static void helper(ArrayList<ArrayList<Integer>> res, ArrayList<Integer> slate, ArrayList<Integer> numbers,
int pos) {
int n = numbers.size();
res.add(new ArrayList<>(slate));
Set<Integer> set = new HashSet<>();
for (int i = pos; i < n; i++) {
if (!set.add(numbers.get(i))) {
// if ((i != pos) && numbers.get(i).equals(numbers.get(i - 1))) {
continue;
}
slate.add(numbers.get(i));
helper(res, slate, numbers, i + 1);
slate.remove(slate.size() - 1);
}
}
// Driver code
public static void main(String args[]) {
ArrayList<Integer> arr = new ArrayList<>(Arrays.asList(10, 10, 1, 2, 2, 2, 10));
for (var v : subsets_with_duplicate(arr)) {
System.out.println(v);
}
}
спасибо за Ваш ответ. Однако, когда мы используем HashSet, Collections.sort(numbers) не нужен. Collections.sort(numbers) предназначен только для сравнения соседних элементов.
ты прав. Нам нужно добавить Collections.sort(numbers), чтобы эти два решения выдавали один и тот же результат. В задаче не сказано, что результат нужно сортировать. Но они действительно на это рассчитывают.
Вы знаете, что
Setтакие какHashSetпросто не допускают дублирования элементов? Если вы прибавите 10 и 10 к одному, вы получите набор с 10 в нем?