2717 半有序排列

·   ·   ·   ·

  ·   ·


题目链接

2717. 半有序排列

分析

由题意可得移动次数只和数组中的最大最小值有关

有以下两种情况

最大值在最小值右边,这种情况下直接交换移动即可

最大值在最小值左边,这种情况下可以在两个数移动到中间的时候,交换这两个数,节省一次交换

计算交换次数用数组的长度减去两个数在数组中位置的差后 $-1$ 即可

代码实现

class Solution {
public:
    int semiOrderedPermutation(vector<int>& nums) {
        auto [x, y] = minmax_element(nums.begin(), nums.end());
        return nums.size() - 1 + (x - y) - (x > y);
    }
};

复杂度分析

  • 时间复杂度:$O(1)$
  • 空间复杂度:$O(1)$