【发布时间】:2020-01-02 02:28:43
【问题描述】:
我仍然是 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);
}
【问题讨论】:
-
这里没有递归,首先不清楚递归在这里有什么目的。忽略递归,正确的解决方案将只涉及一个
for循环,并且只有两个变量,而不是七个。两个和,初始化为 0,一个循环,将适当的值添加到两个和。最后,减去两个和并取绝对值——你不认为这真的比所有这些复杂性要简单得多吗? -
您的代码没有使用递归来解决问题。
-
@SamVarshavchik 其中一个测试用例涉及一个包含超过 500 个元素的 2D 向量,因此它需要是动态的,我误会了递归,我将删除它。
-
@boyanhristov96 是的,对不起。我不是故意输入的,我已经编辑了。
-
好的,我在第一条评论中写的几乎所有内容都是正确的。
标签: c++