算法日志 --- 12.14---全局倒置与局部倒置

82 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情

惊呆了,感觉大家都是在小羊人的边缘

全局倒置与局部倒置

该题出自力扣的775题 —— 全局倒置与局部倒置【中等题】

审题

给你一个长度为 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 。

  • 这道题的题意有点绕,就是给出一个整型数组,按照业务规则,返回对应的true和false
    • 判断全局倒置的数量是否等于局部倒置
    • 全局倒置:左边的大于右边的(不需要紧挨着)
    • 局部倒置:一个数大于右边紧挨着的那个数
  • 那么需要注意的是,如果使用暴力解法,直接遍历全局倒置和局部倒置的个数再去比较的话,会因为用例过大而超时,需要对题意进行分析,发现局部倒置的话,就一定是全局倒置,只有数组完全遵循局部倒置的时候,才会数量相等
  • 遍历数组,从下标2开始,如果当前下标小于定义的最大初始值,那么直接就可以返回false了,因为不属于局部倒置,而是属于全局倒置了,排除局部倒置的情况,只要存在一个全局倒置就返回false
  • 如果全局倒置与局部倒置的数量相等,那么全局倒置就是局部倒置。说明我们不能找到 一对下标(i, j)使 i + 2 <= j 且 A[i] > A[j]

编码

class Solution {
    public boolean isIdealPermutation(int[] nums) {
        int len = nums.length, max = nums[0];
        for (int i = 2; i < len; i++) {
            if (nums[i] < max )return false;
            max = Math.max(max,nums[i - 1]);
        }
        return true;
    }
}

image.png