概述
题目给定一个长度为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 | /** |