如何在子集回溯问题中返回正确的List <List <Integer >>

时间:2019-10-30 04:29:23

标签: java recursion backtracking

我正在处理Leetcode(78个子集)中的一个问题。该方法是正确的,但是我不知道如何返回正确的答案。

我使用了从在线课程中学到的方法。在达到基本情况时,我可以准确地打印出所有子集。但是,我不确定如何将这些子列表添加到结果List<List<Integer>>中并返回它。

我声明了一个全局变量并尝试直接对其进行修改,但是其中的所有子集都是空的。对我来说,将子集添加到结果列表并返回它的好方法是什么?

代码如下:

class Solution {

    List<List<Integer>> result;

    public List<List<Integer>> subsets(int[] nums) {
        List<Integer> chosen = new ArrayList<>();
        List<Integer> numbers = new ArrayList<>();
        for (int i : nums){
            numbers.add(i);
        }
        result = new ArrayList<>();
        subsetsHelper(numbers, chosen);
        return result;
    }

    public void subsetsHelper(List<Integer> nums, List<Integer> chosen){
        if (nums.size() == 0){
            // System.out.println(chosen);
            result.add(chosen);
        }
        else{
            int x = nums.get(0);
            nums.remove(0);

            subsetsHelper(nums, chosen);

            chosen.add(x);
            subsetsHelper(nums, chosen);

            nums.add(0, x);
            chosen.remove(chosen.size()-1);
        }
    }
}

这是测试用例和输出:

Your input
[1,2,3]
Output
[[],[],[],[],[],[],[],[]]
Expected
[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

2 个答案:

答案 0 :(得分:0)

问题在于,当您调用return.add(chosen)时,会将所选列表传递到外部列表,而不是内部列表。

result.get(indexOfOuterList).add(chosen) 

上面的代码应该起作用。

这是我有史以来的第一个答复,对不起,我已尽力而为。 让我知道我是否正确

答案 1 :(得分:0)

问题是这条线

WebDriver driver = new ChromeDriver();
driver.get(url);
WebElement email = driver.findElement(By.xpath("//label[contains(text(),'User ID')]"));
WebElement password = driver.findElement(By.xpath("//label[contains(text(),'Password')]"));
new WebDriverWait(driver,20);
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
email.sendKeys("myemail@gmail.com");

基本上,您在result.add(chosen); 中添加chosen,然后在下一个迭代中对其进行编辑。您要做的是像这样创建一个新列表

result

编辑:执行result.add(new ArrayList<>(chosen)); 时,您可能会认为您将数组列表result.add(chosen);存储在chosen中。但实际上,您存储了对result所包含的arraylist的引用作为其值。添加一个粗略的图可以使事情更清楚

enter image description here

您可能会认为chosen本身会存储整个ArrayList,但实际上,它只是存储对存储在Java堆中的arraylist的引用。当您在chosen中进行更改时,更改将反映在存储对此数组列表的引用的每个位置(在您的情况下,该位置在chosen中。)