2023大厂真题提交网址(含题解):
www.CodeFun2000.com(http://101.43.147.120/)
最近我们一直在将收集到的机试真题制作数据并搬运到自己的OJ上,供大家免费练习,体会真题难度。现在OJ已录入50+道2023年最新大厂真题,同时在不断的更新。同时,可以关注"塔子哥学算法"公众号获得每道题的题解。
题目大意:
给你一个 n ∗ m n*m n∗m的二维矩阵。问你有多少个点对 ( ( x , y ) , ( a , b ) ) ((x,y),(a,b)) ((x,y),(a,b))满足 a r r [ x ] [ y ] > a r r [ a ] [ b ] + ∣ x − a ∣ + ∣ y − b ∣ arr[x][y]>arr[a][b]+|x-a|+|y-b| arr[x][y]>arr[a][b]+∣x−a∣+∣y−b∣.即 a r r arr arr的差值大于两者曼哈顿距离.
题目思路:
1.常见套路:拆绝对值,拆成四种情况.
2.对于四种情况分别考虑。(前者为点A,前者为点B)例如:考虑点B在点A的第一象限时.式子为:
a
r
r
[
x
]
[
y
]
−
x
−
y
>
a
r
r
[
a
]
[
b
]
−
a
−
b
arr[x][y]-x-y>arr[a][b]-a-b
arr[x][y]−x−y>arr[a][b]−a−b.
那么形成一个新的矩阵:
b
[
i
]
[
j
]
=
a
r
r
[
i
]
[
j
]
−
i
−
j
b[i][j]=arr[i][j]-i-j
b[i][j]=arr[i][j]−i−j.
问题转化成:对于每个点
(
i
,
j
)
(i,j)
(i,j),求它与左上角形成的子矩阵中有多少个点的b数组小于该点.
解决方法:离线,对数组b排序。按升序的顺序将点插入到二维树状数组中,每次查询子矩阵的和即可。
对四个象限都这么做一遍即可.
注意点:
1.对每个点来讲,在坐标轴上的点。我们要保证这些点只被计算一次.
那么我们规定在计算1,3象限的时候包含坐标轴,而2.4象限则不包含坐标轴即可。
2.对于数组b相同值部分,要防止重复计算。
以往在一维的情况下,我们在排序的时候加判断即可(值相等的话位置逆序,这样可以保证计算不重复)。
但是在二维的情况不符合!我们要分值域插入才保证正确。具体实现看代码.
复杂度:
四遍二维树状数组,每次插入查询都是两个log,则复杂度为: O ( n 2 l o g 2 n ) O(n^2log^2n) O(n2log2n)