Diagonal Difference对角线差

Diagonal Difference | HackerRank

计算矩阵的对角线差

力扣有道求对角线和

1572. 矩阵对角线元素的和 - 力扣(LeetCode)

只要你知道两边的对角线怎么求,一切都会好起来的

左边的对角线就arr[i][i],右边的的是arr[i][length-1-i]

HackerRank让你求的是左右对角线的差的绝对值

1
2
3
4
5
6
7
8
9
10
11
function diagonalDifference(arr: number[][]): number {
// Write your code here
const length = arr.length
let primarySum = 0;
let secondarySum = 0
for (let i = 0; i < length; i++) {
primarySum += arr[i][i];
secondarySum += arr[i][length - 1 - i];
}
return Math.abs(primarySum - secondarySum);
}

遍历途中记录就行了

力扣的是求和,还需要关心到元素项是不是偶数,(说起来求差不用关心吗):

1
2
3
4
5
6
7
8
9
var diagonalSum = function(mat) {
const length = mat.length
const mid = Math.floor(length / 2)
let sum = 0
for (let i = 0; i < length; i++) {
sum += mat[i][i] + mat[i][length - 1 - i]
}
return sum - mat[mid][mid] * (length & 1)
};

return sum - mat[mid][mid] * (length & 1) 检查是否是奇数,如果是奇数,即中间元素被计算了两次,所以要减一次中心元素值

为什么会重复计算?

因为奇数项的话,会有一个中心值

1 2 3

4 5 6

7 8 9

第一轮

1+3 sum=4

5+5 sum=4+10 =14 这里算了两次

9+7 sum=14+16 = 30

length & 1 &与 两个位都为1时,结果才为1

如果length是偶数,那他二进制最后一位就是0,相反就是1

那为什么求差就不用考虑奇偶呢

因为是求差,相同的早变成0了,没有的东西就不用考虑了