2340. 生成有效数组的最少交换次数 🔒
题目描述
给定一个 下标从 0 开始 的整数数组 nums
。
nums
上的 相邻 元素可以进行 交换。
一个 有效 的数组必须满足以下条件:
- 最大的元素 (如果有多个,则为最大元素中的任何一个) 位于数组中最右边的位置。
- 最小的元素 (如果有多个,则为最小的任何一个元素) 位于数组的最左侧。
返回使 nums
成为有效数组所需的最少交换次数。
示例 1:
输入: nums = [3,4,5,5,3,1] 输出: 6 解释: 进行以下交换: - 交换 1:交换第 3 和第 4 个元素,然后 nums 是 [3,4,5,3,5,1]. - 交换 2:交换第 4 和第 5 个元素,然后 nums 是 [3,4,5,3,1,5]. - 交换 3:交换第 3 和第 4 个元素,然后 nums 是 [3,4,5,1,3,5]. - 交换 4:交换第 2 和第 3 个元素,然后 nums 是 [3,4,1,5,3,5]. - 交换 5:交换第 1 和第 2 个元素,然后 nums 是 [3,1,4,5,3,5]. - 交换 6:交换第 0 和第 1 个元素,然后 nums 是 [1,3,4,5,3,5]. 可以证明,6 次交换是组成一个有效数组所需的最少交换次数。
示例 2:
输入: nums = [9] 输出: 0 解释: 该数组已经有效,因此返回 0。
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 105
解法
方法一:维护最值下标 + 分类讨论
我们可以用下标 $i$ 和 $j$ 分别记录数组 nums
第一个最小值和最后一个最大值的下标,遍历数组 nums
,更新 $i$ 和 $j$ 的值。
接下来,我们需要考虑交换的次数。
- 如果 $i = j$,说明数组
nums
已经是有效数组,不需要交换,返回 $0$; - 如果 $i < j$,说明数组
nums
中最小值在最大值的左边,需要交换 $i + n - 1 - j$ 次,其中 $n$ 为数组nums
的长度; - 如果 $i > j$,说明数组
nums
中最小值在最大值的右边,需要交换 $i + n - 1 - j - 1$ 次。
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 nums
的长度。
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|