概述
题目给定一个长度为N
的数组A
,为[0, 1, ..., N - 1]
的一种排列。全局倒置
指的是 i,j
满足 0 <= i < j < N 并且 A[i] > A[j]
,局部倒置
指的是i
满足 0 <= i < N 并且 A[i] > A[i+1]
。问该数组的全局倒置是否等于局部倒置。
思路
这个问题暴力求解也很好办,按照题目要求扫描下数组即可。
1 | /** |
这段代码的时间复杂度为 O(n2),只能beat 30%,有点慢。考虑下优化。
题目的两个条件可以总结为:
当
0 <= i < i + k < N 并且 A[i] > A[i + k]
时,则存在倒置
。若k = 1
,则为local
,若k ≥ 1
,则为global
。
也就是说,如果存在k > 1,使得A[i] > A[i + k]成立,则 global !== local
。
最原始的数组,为[0, 1, 2, ..., i-1, i, i+1, ..., N-1]
,即A[i] = i
。
假设存在k > 1,使得A[i] > A[i + k]成立
,
则 A[i] != i 且 A[i] > i + 1 或 A[i] < i - 1
,即|A[i]-i| > 1
。
因此,只要遍历一遍数组即可得到答案。
实现
1 | /** |