775. Global and Local Inversions**

775. Global and Local Inversions**

https://leetcode.com/problems/global-and-local-inversions/

题目描述

We have some permutation A of [0, 1, ..., N - 1], where N is the length of A.

The number of (global) inversions is the number of i < j with 0 <= i < j < N and A[i] > A[j].

The number of local inversions is the number of i with 0 <= i < N and A[i] > A[i+1].

Return true if and only if the number of global inversions is equal to the number of local inversions.

Example 1:

Input: A = [1,0,2]
Output: true
Explanation: There is 1 global inversion, and 1 local inversion.

Example 2:

Input: A = [1,2,0]
Output: false
Explanation: There are 2 global inversions, and 1 local inversion.

Note:

  • A will be a permutation of [0, 1, ..., A.length - 1].
  • A will have length in range [1, 5000].
  • The time limit for this problem has been reduced.

C++ 实现 1

这道题只需要判断 local inversions 和 global inversions 是否完全相等, 那么就需要考虑 “完全相等” 的条件到底是什么. 首先, 对数组进行排序, 比如 [0, 1, 2, 3, 4], 如果一个序列完全有序, local inversions 和 global inversions 均为 0. 要出现 local inversions 和 global inversions 完全相等的情况, 只能是两个相邻的数进行了交换才行, 比如 0 和 1 交换, 数组变成了 [1, 0, 2, 3, 4]. 如果 0 和 2 交换, 数组变成 [2, 1, 0, 3, 4], 此时 local inversion 为 1, global inversions 为 2.

假设排序后的数组为 B,当访问到 A[i], 如果 A[i] != B[i], 那么判断是否 A[i+ 1] == B[i] && A[i] == B[i + 1] 成立.

class Solution {
public:
    bool isIdealPermutation(vector<int>& A) {
        auto B = A;
        std::sort(B.begin(), B.end());
        for (int i = 0; i < A.size() - 1; ++ i) {
            if (A[i] != B[i]) {
                if (A[i + 1] == B[i] && B[i + 1] == A[i])
                    ++ i;
                else
                    return false;
            }
        }
        return true;
    }
};

C++ 实现 2

由于 A[0, ..., N - 1] 的组合, 因此一次访问 [0, ... N - 1] 相当于访问排序后的数组 B 了, 就不用像 C++ 实现 1 那样申请额外的空间.

class Solution {
public:
    bool isIdealPermutation(vector<int>& A) {
        int n = A.size();
        for (int i = 0; i < n - 1; i++) {
            if (A[i] != i) {
                if (A[i+1] != i || A[i] != i+1) return false;
                i++;
            }
        }
        return true;
    }
};
发布了227 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Eric_1993/article/details/103998609