Я написал программу для вычисления всех возможных подмножеств заданного массива.Правильное использование объекта списка java
class Solution {
/**
* @param S: A set of numbers.
* @return: A list of lists. All valid subsets.
*/
public ArrayList<ArrayList<Integer>> subsets(int[] nums) {
// write your code here
if(nums == null) return null;
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
ArrayList<Integer> list = new ArrayList<>();
helper(res, list, nums, 0);
return res;
}
private void helper(ArrayList<ArrayList<Integer>> res, ArrayList<Integer> list, int [] nums, int start) {
//res.add(list);
res.add(new ArrayList<Integer>(list));
//System.out.println(list);
for(int i = start; i < nums.length; i++) {
list.add(nums[i]);
//System.out.println(list);
helper(res, list, nums, i+1);
list.remove(list.size()-1);
}
}
}
Программа работает нормально. Однако, если я использую
res.add(list);
вместо
res.add(new ArrayList<Integer>(list));
Тогда это даст неправильный результат. Например, когда я даю этот ввод
int [] nums = new int[]{0};
Ожидаемый выход: [[], [0]]. Однако я получаю [[], []].
Вопросы: 1.Потому что я пытаюсь добавить тот же объект списка к объекту res. Я предполагаю, что объект res ArrayList пытается проверить, находится ли объект списка в нем. Это верно?
2.Почему я получаю [[], []]? Поскольку объект списка будет обновлен до [0] в цикле, почему он не добавляется к объекту res?
Вы понимаете разницу между помещением 'list' в' res' и затем изменением 'list'; и поместив копию 'list' в' res', а затем изменив исходный 'list'? – khelwood
Я думаю, что понял. После того, как я добавлю список в res во второй раз, я сделал list.remove(), поэтому второе добавление также пуст. – drdot