在锯齿状数组 C# 中查找每个数组的总和
Finding the sum of each array in a jagged array C#
我希望接收一个类型为 int[][] 的锯齿状数组,然后 运行 通过数组找到总和最高的特定数组,然后 return 该总和。我在网上做了一些挖掘,但没有找到太多关于如何单独总结每个数组的信息。
例如,如果这是接收到的输入:
int[][] accounts = new int[3][];
accounts[0] = new int[] { 1, 2, 3};
accounts[1] = new int[] { 2, 3, 4 };
accounts[2] = new int[] { 3, 4, 5 };
我最接近的是获取所有元素的总和
for (var i = 0; i < accounts.Length; i++)
{
for (var j = 0; j < accounts[i].Length; j++)
{
sum += accounts[i][j];
}
}
我缺少什么步骤来分离数组并单独求和?
你的问题是你没有保持最大值。
给定
var accounts = new int[][]
{
new[] {1, 2, 3},
new[] {2, 3, 4},
new[] {3, 4, 5}
};
例子
var max = 0;
for (var i = 0; i < accounts.Length; i++)
{
var sum = 0;
for (var j = 0; j < accounts[i].Length; j++)
sum += accounts[i][j];
if (sum > max)
max = sum;
}
但是,让我们看看如何使它更简洁。
你可以使用 foreach
foreach (var array in accounts)
{
var sum = 0;
foreach (var item in array)
sum += item;
if (sum > max)
max = sum;
}
你可以使用 Linq Sum
foreach (var array in accounts)
{
var sum = array.Sum();
if (sum > max)
max = sum;
}
或者您可以使用 Linq Max
和 Sum
var max = accounts.Max(x => x.Sum());
其他资源
Returns the maximum value in a sequence of values.
Computes the sum of a sequence of numeric values.
对您当前的尝试实施的一个简单修复方法是跟踪目前看到的 maxAccountSum
:
using System;
class MainClass
{
public static void Main (string[] args)
{
int[][] accounts = new int[3][];
accounts[0] = new int[] { 1, 2, 3 };
accounts[1] = new int[] { 2, 3, 4 };
accounts[2] = new int[] { 3, 4, 5 };
var maxAccountSum = Int32.MinValue; // To account for if the accounts have negative balances? Like they were all overdrafted or something.
for (var i = 0; i < accounts.Length; i++)
{
var accountSum = 0;
for (var j = 0; j < accounts[i].Length; j++)
{
accountSum += accounts[i][j];
}
maxAccountSum = Math.Max (maxAccountSum, accountSum);
}
Console.WriteLine ("The highest sum in an account is {0}.", maxAccountSum);
}
}
时间-Space分析:
O(mn)
时间,其中m
为账户数,n
为单个账户最大值数。
O(1)
space,因为我们只跟踪几个额外的变量。
输出:
The highest sum in an account is 12.
我希望接收一个类型为 int[][] 的锯齿状数组,然后 运行 通过数组找到总和最高的特定数组,然后 return 该总和。我在网上做了一些挖掘,但没有找到太多关于如何单独总结每个数组的信息。
例如,如果这是接收到的输入:
int[][] accounts = new int[3][];
accounts[0] = new int[] { 1, 2, 3};
accounts[1] = new int[] { 2, 3, 4 };
accounts[2] = new int[] { 3, 4, 5 };
我最接近的是获取所有元素的总和
for (var i = 0; i < accounts.Length; i++)
{
for (var j = 0; j < accounts[i].Length; j++)
{
sum += accounts[i][j];
}
}
我缺少什么步骤来分离数组并单独求和?
你的问题是你没有保持最大值。
给定
var accounts = new int[][]
{
new[] {1, 2, 3},
new[] {2, 3, 4},
new[] {3, 4, 5}
};
例子
var max = 0;
for (var i = 0; i < accounts.Length; i++)
{
var sum = 0;
for (var j = 0; j < accounts[i].Length; j++)
sum += accounts[i][j];
if (sum > max)
max = sum;
}
但是,让我们看看如何使它更简洁。
你可以使用 foreach
foreach (var array in accounts)
{
var sum = 0;
foreach (var item in array)
sum += item;
if (sum > max)
max = sum;
}
你可以使用 Linq Sum
foreach (var array in accounts)
{
var sum = array.Sum();
if (sum > max)
max = sum;
}
或者您可以使用 Linq Max
和 Sum
var max = accounts.Max(x => x.Sum());
其他资源
Returns the maximum value in a sequence of values.
Computes the sum of a sequence of numeric values.
对您当前的尝试实施的一个简单修复方法是跟踪目前看到的 maxAccountSum
:
using System;
class MainClass
{
public static void Main (string[] args)
{
int[][] accounts = new int[3][];
accounts[0] = new int[] { 1, 2, 3 };
accounts[1] = new int[] { 2, 3, 4 };
accounts[2] = new int[] { 3, 4, 5 };
var maxAccountSum = Int32.MinValue; // To account for if the accounts have negative balances? Like they were all overdrafted or something.
for (var i = 0; i < accounts.Length; i++)
{
var accountSum = 0;
for (var j = 0; j < accounts[i].Length; j++)
{
accountSum += accounts[i][j];
}
maxAccountSum = Math.Max (maxAccountSum, accountSum);
}
Console.WriteLine ("The highest sum in an account is {0}.", maxAccountSum);
}
}
时间-Space分析:
O(mn)
时间,其中m
为账户数,n
为单个账户最大值数。O(1)
space,因为我们只跟踪几个额外的变量。
输出:
The highest sum in an account is 12.