2D array diagonal difference - HackerRank

October 21, 2020

This diagonal difference quiz is from HackerRank, Basic level of Problem Solving.


You are given a 2D array that inner and outer arrays are the same length. The inner array has integers, and the integers constraints are from -100 to 100.


Return the absolute difference between the sums of the matrix's two diagonals as a single integer.

How I solved this

Let me explain what a 2D array is before showing my solution.

2 dimensional array

When you face 2D array ,which is an array of arrays, it represents a table with rows and columns; outer array length is the number of rows of a matrix, and the inner array length is the numbers of columns of a matrix. For example, the matrix of 2D array [[1, 2, 3], [4, 5, 6], [7, 8, 9], [0, 1, 2]] is going to be:

* * * 1, 2, 3 # 4, 5, 6 # 9, 8, 7 # 0, 1, 2 # // * is column // # is row


In this problem, the outer and inner arrays always have the same length, you can calculate the diagonals of length x length matrix. My solution that passed all test of HackerRank:

const absDiagonalDifference = arr => { let diago1 = 0; let diago2 = 0; for (let i = 0; i < arr.length; i++) { diago1 += arr[i][i]; diago2 += arr[i][arr.length - i - 1]; } return Math.abs(diago1 - diago2); };

Let's test this:

const test = [[1,2,3], [4,5,6], [9,8,7]]; absDiagonalDifference(test)l;

This is going to be 3 x 3 matrix:

1, 2, 3 4, 5, 6 9, 8, 7

What you need is the sum of diagonals, 1 + 5 + 7 and 3 + 5 + 9. To explain this problem easier, I name top left to bottom right diagonal diago1 and top right to bottom left diagonal diago2.

To calculate the sum of diago1, you need to get the first element in the first array, the second element in the second array, and the last element in the last array. This sounds easy because I can use the same index to access the inner array element as the outer array index.

When it's i = 0, diago1 points arr[0][0], which means first row and first column, which is 1. Diago1 is currently equal to 1. Then index increases by one and now i = 1. This is accessing arr[1][1], which is second row and second column, 5. Now diago2 = 1 + 5;
Like this, from top left to bottom right diagonal get calculated in a simple way.

I confused a little to think of how to orderly iterate from the last element to the first element by rows, for example, in this 3x3 example, I want to access the last element of an inner array, then second last from the second array, then the first element of the last array.
I know that [array.length - 1] is the way to access the last element of an array, and [array.length - 2] is to access the second to last element of the array. We can use this!
All I need to do is dynamically calculate this using array.length and i, which going to be [array.length - i - 1]. When it's on the first arr[0], it accesses the last column, arr[0][2], which is a result of 3 - 0 - 1.
Then the index increases by one and now i = 1. This is accessing arr[1][1], which is a result of 3 - 1 - 1.
Then index increases again, i = 2, then now it's arr[2][0], which is a result of 3 - 2 - 1.


As you can expect, this solution will work with 4x4, 5x5, 6x6... matrix!