首页 > 其他分享 >记录一个小问题

记录一个小问题

时间:2024-04-25 11:37:07浏览次数:23  
标签:LinkedList 记录 一个 ArrayList 问题 int result new path

引发错误结果的代码:

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> combine(int n, int k) {
        backTracking(n, k, 1);
        return result;
    }

    public void backTracking(int n, int k, int startIndex) {
        if (path.size() == k) {
            result.add(path);
            return;
        }

        for (int i = startIndex; i <= n; i++) {
            path.add(i);
            backTracking(n, k, i + 1);
            path.removeLast();
        }
    }
}

正确代码:

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> combine(int n, int k) {
        backTracking(n, k, 1);
        return result;
    }

    public void backTracking(int n, int k, int startIndex) {
        if (path.size() == k) {
            result.add(new ArrayList<>(path));
            return;
        }

        for (int i = startIndex; i <= n; i++) {
            path.add(i);
            backTracking(n, k, i + 1);
            path.removeLast();
        }
    }
}

原因:

在这段代码中,result 是保存最终结果的列表,path 是保存当前组合的临时列表。在回溯算法中,当找到一个满足条件的组合时,我们需要将当前的组合加入到最终结果 result 中。
由于 path 是一个 LinkedList,直接将 path 添加到 result 中会有一些问题。因为 path 最开始是一个空的 LinkedList,在回溯的过程中,不断地向其添加元素,然后又不断地移除末尾元素。所以如果直接将 path 添加到 result 中,后续的操作可能会修改 path 的内容,导致 result 中的组合也随之改变。
为了解决这个问题,我们需要将 path 添加到 result 时,创建一个新的 ArrayList 对象,将 path 的元素拷贝到新的列表中,然后将这个新的列表添加到 result 中。这样做的目的是确保 path 的内容不会随后续操作改变。因为 ArrayList 是通过拷贝的方式创建的,所以即使 path 之后被修改,添加到 result 中的组合也不会受到影响。
因此,result.add(new ArrayList<>(path)); 的作用是将当前的组合(由 path 代表)添加到 result 中并保存。

标签:LinkedList,记录,一个,ArrayList,问题,int,result,new,path
From: https://www.cnblogs.com/techgy/p/18157233

相关文章

  • 前端调用DRI后端API出现跨域资源共享(CORS)问题解决办法
    目录1.引言2.跨源资源共享和实现方法3.在Django项目中配置django-cors-headers库Reference1.引言在进行后端API开发时,有时会遇到“跨域资源共享(CORS)请求...被阻止“的错误,如图1所示。本文讲解如何在使用DRF(DjangoRESTFramework)的后端API开发项目中解决这个问题。Ac......
  • java多模块项目依赖问题
    eg:b项目依赖a项目 a项目中的pom文件 注意全是自定义的<groupId>:通常表示项目所属的组织或公司的反向域名。这是为了保证全球唯一性<artifactId>:是项目的名称。这通常是项目的简单名称,它应该清晰地描述项目的内容。<version>:是项目的版本号。 b项目中的pom文件 ......
  • 报告!这里发现了一个赛博炼丹的神级平台!
    众所周知,“赛博炼丹”是一个AI开发研究领域古老又神秘的活动,它往往对炼丹平台有很高的要求。如果你也是一路从“炼丹小白”成长到“资深AI算法工程师”,那你一定懂我在说什么?说好了,天台见!立即免费体验:https://gpumall.com/login?type=register&source=cnblogs下面这些问题,你是......
  • 大型企业不同安全域文件交换,常见方式的优势与问题对比
    现在越来越多的企业通过对网络进行物理或逻辑隔离,将内部网络与外部网络隔离开来,从而限制非法访问和恶意渗透,防止敏感数据泄露和恶意代码的传播,提高网络安全性。对于大型企业而言,将网络分为内外网并不足以满足安全管控的需求,它们会在内部再分割不同的安全域,如黄区、绿区、红区;如生......
  • 在Linux中,如何创建一个新用户?
    在Linux中创建新用户通常使用useradd命令或adduser命令。这两个命令的功能相似,但adduser命令在某些发行版(如Debian及其衍生版)中更常用,因为它提供了一个更为友好的交互过程,自动处理一些额外的设置,比如创建邮箱、设置密码等。下面是使用这两个命令创建新用户的详细步骤:1.使用user......
  • 在Linux中,如何添加一个用户到特定的组?
    在Linux系统中,用户可以属于一个或多个组。将用户添加到特定的组是权限管理的一部分,允许用户继承组的权限和访问控制。以下是将用户添加到特定组的步骤:1.使用usermod命令使用usermod命令:要将用户添加到现有的组,你可以使用usermod命令的-aG(appendtogroup)选项。sudousermod......
  • EBS:销售订单历史记录
    EBSR12.x 销售订单修改历史记录--订单行修改记录表SELECT*FROMONT.OE_ORDER_LINES_HISTORYOOLHWHEREHEADER_ID=15871343--SO#102602476109ORDERBYLINE_NUMBER,SHIPMENT_NUMBER/*HIST_COMMENTS:历史记录说明HIST_TYPE_CODE:历史记录类型,如:CANCELLA......
  • 926-基于PCIe的40Gbps光纤采集记录仪
    基于PCIe的40Gbps光纤采集记录仪   ORI-D2000信号记录仪是一款便携式记录仪产品,满足高达40GBps的数据存储速度、可扩展的大容量存储设备和配套的录取存储管理软件。主要特点  1、基本系统内存64GB,存储容量为7.6T,可扩展至四个盘位。  2、包含一张FPG......
  • dotnet 已知问题 错误标记 MethodImplOptions.InternalCall 特性参数将会在类型访问之
    本文将记录一个dotnet的已知问题。当自己不小心在方法上不正确标记了MethodImplAttribute特性时,错误选择了MethodImplOptions.InternalCall参数,那将会在运行的过程在,在此类型被访问之前就抛出了System.TypeLoadException异常,错误信息是Internalcallmethodwithnon_NUL......
  • WPF 使用 ManipulationDemo 工具辅助调试设备触摸失效问题
    本文将和大家介绍我所在的团队开源的ManipulationDemo工具。通过ManipulationDemo工具可以提升调试设备触摸失效的效率此工具在GitHub上完全开源,请看https://github.com/dotnet-campus/ManipulationDemo/软件界面效果大概如下可以显示接收到的Win32消息、当前的触摸......