【问题标题】:C# jagged array to list of listsC# 锯齿状数组到列表列表
【发布时间】:2023-03-04 17:12:01
【问题描述】:

给定一个锯齿状数组:

int[][] edges = new int[][] 
            {
                new int[] {0,1},
                new int[] {0,2},
                new int[] {0,3},
                new int[] {1,4},
            };

有没有更优雅的方法来做到这一点:

var adjlist = new List<List<int>>();
            for(int i=0; i<n; i++)
            {
                adjlist.Add(new List<int>());
            }
            
            foreach(var arr in edges)
            {
                int src = arr[0];
                int dst = arr[1];

                adjlist[src].Add(dst);
                adjlist[dst].Add(src);
            }

可以改善时间复杂度的方法是理想的。

谢谢。

【问题讨论】:

  • 没有什么可以提高时间复杂度,因为它已经尽可能快了 - 第一个维度的线性时间(new List&lt;&gt;(),列表索引和添加项目到列表是恒定的时间操作)。
  • 这段代码是否按您的预期/想要的那样工作?因为它做了一个相当不寻常和可疑的操作
  • 代码有效。这是一个 leetcode 问题 261 并通过了那里的测试。将边列表转换为无向图。

标签: c# list jagged-arrays


【解决方案1】:

我的假设是您示例中的代码没有按您的预期工作(我可能错了)。但是,将锯齿状数组转换为列表列表应该像下面这样简单。我怀疑你会比这更有效率,尽管你可以进行基准测试。

以下是 O(n),这意味着某处需要迭代每个元素。也就是说,内存无法魔法。话虽如此,ToList 将使用 collection 调用 List 构造函数,并使用实例成员 CopyTo,而后者又使用 Array.Copy,因此 非常针对数据类型和平台进行了优化。

var results = edges.Select(x => x.ToList()).ToList();

【讨论】:

    猜你喜欢
    • 2019-11-17
    • 2013-09-17
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2021-08-02
    • 2015-07-08
    相关资源
    最近更新 更多