我仍然是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循环(索引ij)方法可以隐式折叠为一个循环,其中column = irowA = irowB= (n - 1) - i(从零开始)。这是因为您可以对表达式的加法和减法项进行重新排序,因为整数加法是可交换的。

简单来说,根据您的示例:
(11 + 5 - 12) - (10 + 5 + 4)(11 - 10) + (5 - 5) + (-12 - 4)相同,您可以利用这一事实来简化您的代码以访问每一列一次,将差值累加到一个变量中,而不必尝试同时评估对角线和存储中间结果。

关于c++ - C++对角线差异问题,我要去哪里错了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59557747/

10-11 09:11
查看更多