Я использую алгоритм обратного отслеживания для решения перестановки с дублирующимися значениями в коде 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);
}
}