LC775.全局倒置与局部倒置题解
题目来源LC775.全局倒置与局部倒置
题干
给你一个长度为 n 的整数数组 nums ,表示由范围 [0, n - 1] 内所有整数组成的一个排列。
全局倒置 的数目等于满足下述条件不同下标对 (i, j) 的数目:
-
0 <= i < j < n
-
nums[i] > nums[j]
局部倒置 的数目等于满足下述条件的下标 i 的数目:
- 0 <= i < n - 1
- nums[i] > nums[i + 1]
当数组 nums 中 全局倒置 的数量等于 局部倒置 的数量时,返回 true ;否则,返回 false
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/global-and-local-inversions
思路
这是lc的每日一题,拿到这个题目我一开始以为是求全局倒置和局部倒置的数量x,y,
思考出一套n+nlogn的时间复杂度,难点在于求全局倒置,我的思路是先将数组转换为list,然后通过n次二分查找到对应的数x(从0->n),然后将x值的右边数目+到ans中,然后删除x,执行n次最后的ans值就是全局倒置数。
比如一开始找到0,然后0右边的数均为全局倒置,删去0
找到1,然后1右边的数均为全局倒置,删去1
…
依次到n
最终的时间复杂度为O(nlogn)
当然,该题目只需要求全局倒置和局部倒置是否一致,那么就可以将问题转化为是否存在非局部倒置的全局倒置(因为局部倒置必为全局倒置),可以采用维护最大前缀或者维护最小后缀的方法
以下代码为维护最大前缀的方法,最小后缀方法同理。
代码
class Solution {
public boolean isIdealPermutation(int[] nums) {
int n = nums.length;
int max = nums[0];
if(n==2) return true;
for(int i=1;i<n-1;i++){
if(nums[i+1]<max) return false;
max = Math.max(nums[i],max);
}
return true;
}
}
- 时间复杂度:O(n),其中 n 是nums 的长度。
- 空间复杂度:O(1),只使用到常数个变量空间。
Push myself.
求点赞 关注 评论 不定期更新~👍