При добавлении списка во вложенный список, почему вам нужно использовать конструктор для создания нового экземпляра списка вместо простого добавления существующего списка? - PullRequest
0 голосов
/ 08 октября 2019

Я использую алгоритм обратного отслеживания для решения перестановки с дублирующимися значениями в коде leet. Я поставил свое решение ниже. По сути, моя идея состоит в том, чтобы использовать временный LinkedList (temp) для создания возможных перестановок, и когда его длина равна длине массива, добавьте его в список ответов List>. Мой вопрос заключается в том, что при добавлении временного списка в список ANS, если я просто использую ans.add (temp) (как в подтвержденной строке), список ANS просто заканчивается списком пустого списка. И я нашел правильное решение использовать ans.add (новый LinkedList (temp)) .

Мой вопрос:

1. Используется ли конструктор класса LinkedList?
2. Почему я не могу просто добавить временный список в список ANS? Что происходит за кулисами?

class Solution {
    public List<List<Integer>> permuteUnique(int[] nums) {
        List<List<Integer>> ans = new LinkedList<>();
        if(nums.length==0)
            return ans;
        Map<Integer, Integer> map = new HashMap<>();
        for(int num : nums){
            map.put(num, map.getOrDefault(num,0)+1);
        }

        backtracking(map,ans,new LinkedList<Integer>(),nums.length);
        return ans;

    }

    public void backtracking(Map<Integer, Integer> map, List<List<Integer>> ans, LinkedList<Integer> temp, int length){
        if(temp.size()==length){
            //ans.add(temp); why doesn't this work???
            ans.add(new LinkedList<Integer>(temp));
            return;
        }
        for(Integer key: map.keySet()){
            int num = map.get(key);
            if(num==0)
                continue;
            manipulate(map,key,-1);
            temp.add(key);
            backtracking(map,ans,temp,length);
            manipulate(map,key,+1);
            temp.remove(temp.size()-1);
        }

    }

    public void manipulate(Map<Integer, Integer> map,int key, int delta){
        map.put(key, map.get(key)+delta);
    }
}

1 Ответ

3 голосов
/ 08 октября 2019

Делая:

ans.add(temp)

Вы добавляете один и тот же список снова и снова, потому что в Java ваш temp параметр действует как «ссылка» (является указателем). Следовательно, вам нужно создать новый LinkedList <>, чтобы он работал как разные объекты и выполнял ваш список

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...