Использование HashSet для фильтрации дубликатов не работает в подмножествах с проблемой дублирования

Проблема заключается в том, что «данный список чисел, которые могут содержать дубликаты, возвращает все возможные подмножества (набор мощности).

Набор решений не должен содержать повторяющихся подмножеств. Верните решение в любом порядке».

У меня есть простой код, чтобы использовать похожие способы решения этой проблемы. Однако подход 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);
        }
    }
}

Почему?

Разница в частичном выходе между этими двумя решениями выделена красным.

Вы знаете, что Set такие как HashSet просто не допускают дублирования элементов? Если вы прибавите 10 и 10 к одному, вы получите набор с 10 в нем?

Louis Wasserman 16.10.2022 03:02

@LouisWasserman вот силовой набор. Целочисленные элементы могут иметь одинаковое значение, но они не совпадают.

Don 16.10.2022 03:08

@LouisWasserman Думаю, вы напоминаете мне, почему использование hashset не работает, поскольку hashset фильтрует элементы с одинаковыми значениями. Но я все еще не понимаю, почему решение hashset имеет больше выходов.

Don 16.10.2022 03:12

Каждый вызов helper создает новый набор, поэтому вы получаете уникальный результат только в рамках одного вызова helper.

Mark Rotteveel 16.10.2022 07:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам не хватает 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) предназначен только для сравнения соседних элементов.

Don 20.10.2022 05:54

ты прав. Нам нужно добавить Collections.sort(numbers), чтобы эти два решения выдавали один и тот же результат. В задаче не сказано, что результат нужно сортировать. Но они действительно на это рассчитывают.

Don 22.10.2022 03:35

Другие вопросы по теме