簡體   English   中英

為什么我在解決冪集/子集問題時得到空的 2d ArrayList,例如 [ [ ]、[ ]、[ ]、...],而不是在 2d ArrayList 中添加 ArrayList?

[英]Why I am getting empty 2d ArrayList such as [ [ ], [ ], [ ], ... ] instead of adding ArrayList in 2d ArrayList while solving power set/subset problem?

我在遞歸的幫助下使用 java 解決了 leetcode 上的子集問題 但問題是我沒有將 ArrayList 添加到 2d ArrayList 我得到 { {}, {}, {}, ...} 作為我的輸出而不是 { {1,2,3}, {1,2}, {1 ,3}、{1}、{2,3}、{2}、{3}、{}}。 有人可以解釋一下為什么會這樣嗎?

public static void main(String[] args) {
    int[] nums = {1, 2, 3};
    List<List<Integer>> result = new ArrayList<List<Integer>>();
    List<Integer> arr = new ArrayList<Integer>();
    helper(0, result, arr, nums);
    System.out.println(result);
}

public static void helper(int index, List<List<Integer>> result, List<Integer> arr, int[] nums){
    if(index == nums.length){
        result.add(arr);
        return;
    }
    arr.add(nums[index]);
    helper(index+1, result, arr, nums);
    arr.remove(arr.size()-1);
    helper(index+1, result, arr, nums);
}

上述代碼的輸出

此外,當我編寫此代碼時,它可以正常工作。 為什么?

public List<List<Integer>> subsets(int[] nums) {
    List<List<Integer>> result = new ArrayList(); // pay attention 
    List<Integer> arr = new ArrayList<Integer>();
    helper(0, result, arr, nums);
    return result;
}

public void helper(int index, List<List<Integer>> result, List<Integer> arr, int[] nums){
    if(index == nums.length){
        result.add(new ArrayList<Integer>(arr)); // pay attention 
        return;
    }
    arr.add(nums[index]);
    helper(index+1, result, arr, nums);
    arr.remove(arr.size()-1);
    helper(index+1, result, arr, nums);
}

正確輸出截圖

當你使用result.add(arr); ,添加到result中的所有arr都與您的main函數中定義的相同。 因為arr最后是 [],所以你的結果是[[], [], [], [], [], [], [], []]

但是當你使用result.add(new ArrayList<Integer>(arr)); ,您創建了一個匿名的新ArrayList對象,該對象與arr當時的內容相同。 但是當arr的內容發生變化時,它對這個匿名對象沒有任何作用。 所以最后,你得到了不同孩子的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM