楼主: love1point
跳转到指定楼层
上一主题 下一主题
收起左侧

LC里的 List<List<Integer>>

🔗
 楼主| love1point 2015-6-14 20:48:56 | 只看该作者
全局:
非常诡异。

我把中间几行放空,结果错误还是在第15行,关键是第15行就没代码
Line 15: error: incompatible types: ArrayList<ArrayList<Integer>> cannot be converted to List<List<Integer>>
  1. public class Solution {
  2.     public ArrayList<ArrayList<Integer>> subsets(int[] nums) {
  3.         ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
  4.         ArrayList<Integer> curr = new ArrayList<Integer>();
  5.         if(nums == null || nums.length == 0)
  6.         {
  7.             return result;
  8.         }
  9.         Arrays.sort(nums);
  10.         subsets(nums, 0, curr, result);
  11.         return result;
  12.     }
  13.    
  14.    
  15.    
  16.    
  17.    
  18.    
  19.     public void subsets(int[] nums, int j, ArrayList<Integer> curr, ArrayList<ArrayList<Integer>> result)
  20.     {
  21.       
  22.         ArrarList<Integer> temp = new ArrayList<Integer>(curr);
  23.         result.add(temp);
  24.         
  25.         for(int i = j; i < nums.length; i++)
  26.         {
  27.             curr.add(nums[i]);
  28.             subsets(nums, i+1, curr, result);
  29.             curr.remove(curr.size()-1);
  30.         }
  31.     }
  32. }
复制代码
回复

使用道具 举报

🔗
 楼主| love1point 2015-6-14 20:52:20 | 只看该作者
全局:
用了别人几个ac过的代码,发现,对于这题,但凡改成 ArrayList<ArrayList<List>>现在全过不了??
回复

使用道具 举报

🔗
stellari 2015-6-14 20:54:29 | 只看该作者
全局:
love1point 发表于 2015-6-14 20:48
非常诡异。

我把中间几行放空,结果错误还是在第15行,关键是第15行就没代码

“第15行”并非你自己代码的15行。系统在你的代码之前加了一些初始化语句。15行是这两者合起来的第15行。所以我才说让你确定出错的是哪一行。
回复

使用道具 举报

🔗
 楼主| love1point 2015-6-14 21:00:52 | 只看该作者
全局:
stellari 发表于 2015-6-14 20:54
“第15行”并非你自己代码的15行。系统在你的代码之前加了一些初始化语句。15行是这两者合起来的第15行。 ...

“系统在你的代码之前加了一些初始化语句。15行是这两者合起来的第15行”

没看懂? 求解?
回复

使用道具 举报

🔗
yhfyhf 2015-6-14 21:14:11 | 只看该作者
全局:
本帖最后由 yhfyhf 于 2015-6-14 21:15 编辑
love1point 发表于 2015-6-14 20:43
谢谢。但依然不行

怎么不行,我说了那一处你就只改了那一处吗?其他地方都要改呀。

  1. public class Solution {
  2.     public List<List<Integer>> subsets(int[] nums) {
  3.         List<List<Integer>> result = new ArrayList<>();
  4.         List<Integer> curr = new ArrayList<Integer>();
  5.         if(nums == null || nums.length == 0)
  6.         {
  7.             return result;
  8.         }
  9.         Arrays.sort(nums);
  10.         subsets(nums, 0, curr, result);
  11.         return result;
  12.     }
  13.    
  14.     public void subsets(int[] nums, int j, List<Integer> curr, List<List<Integer>> result)
  15.     {
  16.         List<Integer> temp = new ArrayList<Integer>(curr);
  17.         result.add(temp);
  18.         
  19.         for(int i = j; i < nums.length; i++)
  20.         {
  21.             curr.add(nums[i]);
  22.             subsets(nums, i+1, curr, result);
  23.             curr.remove(curr.size()-1);
  24.         }
  25.     }
  26. }
复制代码
还是帮你一次性改完吧,现在可以AC了。
建议好好看一下Oracle的文档,Interface, Class, Implement.
回复

使用道具 举报

🔗
mnmunknown 2015-6-14 21:17:12 | 只看该作者
全局:
把lz的代码改成这样就过了。

保持原本函数的List<List<Integer>>,instantiate的时候用 new ArrayList<List<Integer>>(); 原因和楼上几位说的一样, List作为interface不能建instance,但是ArrayList可以。这样的写法是为了更好的利用多态。

public class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        ArrayList<Integer> curr = new ArrayList<Integer>();
        if(nums == null || nums.length == 0)
        {
            return result;
        }
        Arrays.sort(nums);
        subsets(nums, 0, curr, result);
        return result;
    }
   
    public void subsets(int[] nums, int j, ArrayList<Integer> curr, List<List<Integer>> result)
    {
        ArrayList<Integer> temp = new ArrayList<Integer>(curr);
        result.add(temp);
        
        for(int i = j; i < nums.length; i++)
        {
            curr.add(nums[i]);
            subsets(nums, i+1, curr, result);
            curr.remove(curr.size()-1);
        }
    }
}
回复

使用道具 举报

🔗
 楼主| love1point 2015-6-14 21:20:20 | 只看该作者
全局:
yhfyhf 发表于 2015-6-14 21:14
怎么不行,我说了那一处你就只改了那一处吗?其他地方都要改呀。还是帮你一次性改完吧,现在可以AC了。
...

你这样改,的确能ac,那我的问题又来了。

请问,为什么,在combination sum里,我们同样把它默认的List<List<Integer>> 改成ArrayList的,可以过,为啥subsets改了就不行呢?
  1. public class Solution {
  2.     public ArrayList<ArrayList<Integer>> combinationSum(int[] candidates, int target) {
  3.         ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
  4.         ArrayList<Integer> curr = new ArrayList<Integer>();
  5.         
  6.         if(candidates == null || candidates.length == 0)
  7.         {
  8.             return result;
  9.         }
  10.         Arrays.sort(candidates);
  11.         combinationSum(candidates, target, 0, curr, result);
  12.         return result;
  13.     }
  14.    
  15.     public void combinationSum(int[] candidates, int target, int j, ArrayList<Integer> curr, ArrayList<ArrayList<Integer>> result)
  16.     {
  17.         //递归的终止条件,递归一定要有终止条件
  18.         if(target == 0)
  19.         {
  20.             ArrayList<Integer> temp = new ArrayList<Integer>(curr);
  21.             result.add(temp);
  22.             return;
  23.         }
  24.         
  25.         for(int i = j; i < candidates.length; i++)
  26.         {
  27.             //如果该元素大于target,超过了,肯定不符合,退出
  28.             if(target < candidates[i])
  29.             {
  30.                 return;
  31.             }
  32.             curr.add(candidates[i]);
  33.             //递归
  34.             combinationSum(candidates, target-candidates[i], i, curr, result);
  35.             //如果没找到,回溯
  36.             curr.remove(curr.size()-1);
  37.         }
  38.     }
  39. }
复制代码
回复

使用道具 举报

🔗
 楼主| love1point 2015-6-14 21:24:17 | 只看该作者
全局:
yhfyhf 发表于 2015-6-14 21:14
怎么不行,我说了那一处你就只改了那一处吗?其他地方都要改呀。还是帮你一次性改完吧,现在可以AC了。
...

这行不太理解:List<List<Integer>> result = new ArrayList<>();
这个ArrayList<>() 咋可以这样写啊
回复

使用道具 举报

🔗
yhfyhf 2015-6-14 21:32:25 | 只看该作者
全局:
love1point 发表于 2015-6-14 21:24
这行不太理解:List result = new ArrayList();
这个ArrayList() 咋可以这样写啊

对,为了简便可以这么写。这是Java8才有的貌似。
回复

使用道具 举报

🔗
 楼主| love1point 2015-6-14 21:37:56 | 只看该作者
全局:
yhfyhf 发表于 2015-6-14 21:32
对,为了简便可以这么写。这是Java8才有的貌似。

不懂为啥非得这样List result = new ArrayList();
这样List result = new ArrayList<ArrayList<Integer>>() 就错

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表