LC775.全局倒置与局部倒置

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.

求点赞 关注 评论 不定期更新~👍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值