题目链接
分析
由题意可得移动次数只和数组中的最大最小值有关
有以下两种情况
最大值在最小值右边,这种情况下直接交换移动即可
最大值在最小值左边,这种情况下可以在两个数移动到中间的时候,交换这两个数,节省一次交换
计算交换次数用数组的长度减去两个数在数组中位置的差后 $-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)$