【算法】小点:List.remove
1、List.remove
在写一道简单递归时发现问题:
cur.add(nums[i]); dfs(nums,cur,res); cur.remove(nums[i]); 主要是这三行代码,发现出现指针异常。其实问题是:
List的remove方法有两个重载:remove(int index)和remove(Object o)。
在这里,nums[i]是int类型,所以调用的是remove(int index)方法,它会移除指定索引位置的元素。
如果当前列表cur的大小为size,那么索引范围是0到size-1。当我们调用cur.remove(nums[i])时,如果nums[i]的值大于等于cur的大小,就会抛出IndexOutOfBoundsException。
所以,在递归回溯时,我们通常移除最后一个元素,所以更常见的写法是:
cur.remove(cur.size()-1);
或者,如果我们知道要移除的对象,也可以使用:
cur.remove(Integer.valueOf(nums[i]));
2、add(cur)
知道在写回溯的时候,一般会有:List<List<Integer>> res= new ArrayList<>(); List<Integer> cur = new ArrayList<>() ;
然后在dfs中判断添加:res.add 不过要注意,这里面要写 res.add(new ArrayList(cur)); 每次都是新的,否则这个cur是同一个值,每个都一样。