给定一个交错的数组:
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);
}
改进时间复杂度的东西是理想的。
谢谢。
最佳答案
我的假设是您的示例中的代码未按您的预期运行(我可能错了)。然而,将锯齿状数组转换为列表列表应该像下面这样简单。我怀疑你会比这更有效率,尽管你可以进行基准测试。
以下是 O(n),这意味着某处需要迭代每个元素。也就是说,内存不能被魔法。也就是说,ToList
将使用 collection 调用 List
构造函数并使用实例成员 CopyTo
,其中 - turn 使用 Array.Copy
,因此极度针对数据类型和平台进行了优化。
var results = edges.Select(x => x.ToList()).ToList();
关于C# 锯齿状数组到列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65712821/