首页 > 解决方案 > 通常将数组分配给临时数组与创​​建新数组然后分配它有什么区别?

问题描述

我试图解决一个 leetcode 问题(问题 78),逻辑对我来说非常清楚,但由于某种原因,我永远无法实现它。

    class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        
        
ArrayList<List<Integer>> arr = new ArrayList();

arr.add(new ArrayList<>());

for (int i = 0; i<nums.length; i++) {
    
    int n = arr.size();
    
    for (int j = 0; j<n; j++) {
        
        List<Integer> temp = new ArrayList(arr.get(j)) ;
        
        temp.add(nums[i]);
        
        arr.add(temp);
        
    }
    
    
}

return arr; 
   
    }
}

上面的代码完美地工作(因为我在复制 arr.get(j) 数组之前创建了一个新的 ArrayList)但下面的代码没有

    class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        
        
ArrayList<List<Integer>> arr = new ArrayList();

arr.add(new ArrayList<>());

for (int i = 0; i<nums.length; i++) {
    
    int n = arr.size();
    
    for (int j = 0; j<n; j++) {
        
        List<Integer> temp = arr.get(j) ;
        
        temp.add(nums[i]);
        
        arr.add(temp);
        
    }
    
    
}

return arr; 
   
    }
}

对不起,如果我听起来很沮丧,但是,为什么!在世界的屋顶上,第二个代码会产生奇怪的结果吗?有什么不同?我在这上面浪费了几个小时。

标签: javaarraylistsubset

解决方案


第一个是创建into的浅拷贝arr.get(j)temp

第二种解决方案只是将arr.get(j)(这是一个引用)的值复制到temp. 它们都将引用同一个对象。


推荐阅读