我仍然是C++的初学者,并尝试解决“对角线差异”问题。
给定一个方阵,我应该计算其对角线之和之间的绝对差。
例如:
11 2 4
4 5 6
10 8 -12
主对角线:
11
5
-12
次对角线:
4
5
10
解决方案为15。(绝对值)
我的代码在某些测试用例中有效,但并非全部。我陷入困境,想知道我哪里出了错。这是我到目前为止的内容:
int diagonalDifference(vector<vector<int>> arr)
{
int firstTotal = 0;
int secondTotal = 0;
int absTotal = 0;
int firstMiddleNumbers = 0;
int secondMiddleNumbers = 0;
int lastY = arr.size()-1;
int lastX = arr[0].size()-1;
for(int i = 1; i < arr.size(); i++)
{
firstMiddleNumbers += arr[i][i];
}
firstTotal = arr[0][0] + firstMiddleNumbers + arr[lastX][lastY];
for(int j = arr[0].size()-1; j > 0; j--)
{
secondMiddleNumbers += arr[j][j];
}
secondTotal = arr[lastX][0] + secondMiddleNumbers + arr[0][lastY];
absTotal = abs(firstTotal-secondTotal);
return absTotal;
}
编辑:
更新了解决方案,仍在将其放入一个for循环中。
int diagonalDifference(vector<vector<int>> arr)
{
int firstMiddleNumbers = 0;
int secondMiddleNumbers = 0;
int k = 0;
for(int i = 0; i <= arr.size()-1; i++)
{
firstMiddleNumbers += arr[i][i];
}
for(int j = arr[0].size()-1; j >= 0; j--)
{
secondMiddleNumbers += arr[j][k];
k++;
}
return abs(firstMiddleNumbers-secondMiddleNumbers);
}
最佳答案
您只需要一个运行的“difference total”变量,并且只需要一个for循环。
提示:每列访问一次。您只需要一个for循环,因为它是一个方矩阵。幼稚的双嵌套for循环(索引i
和j
)方法可以隐式折叠为一个循环,其中column = i
,rowA = i
和rowB= (n - 1) - i
(从零开始)。这是因为您可以对表达式的加法和减法项进行重新排序,因为整数加法是可交换的。
简单来说,根据您的示例:(11 + 5 - 12) - (10 + 5 + 4)
与(11 - 10) + (5 - 5) + (-12 - 4)
相同,您可以利用这一事实来简化您的代码以访问每一列一次,将差值累加到一个变量中,而不必尝试同时评估对角线和存储中间结果。
关于c++ - C++对角线差异问题,我要去哪里错了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59557747/