列表

详情


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。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int minimumSwaps(vector<int>& nums) { } };

java 解法, 执行用时: 1 ms, 内存消耗: 53.9 MB, 提交时间: 2023-10-17 11:34:06

class Solution {
    public int minimumSwaps(int[] nums) {
        int min = 0;
        int max = 0;
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] < nums[min]) min = i;
            else if (nums[i] >= nums[max]) max = i ;
        }
        return (min - 0) + (nums.length - 1 - max) - (min > max ? 1 : 0 );
    }
}

javascript 解法, 执行用时: 80 ms, 内存消耗: 47.9 MB, 提交时间: 2023-10-17 11:33:37

/**
 * @param {number[]} nums
 * @return {number}
 */
var minimumSwaps = function(nums) {
    let min_i = 0, max_i = 0, c = 0;
    for(let i = 0; i < nums.length; i++){
       if(nums[min_i] > nums[i]){
         min_i = i;  // 最左边的最小值
       } 
       if(nums[max_i] <= nums[i]){
         max_i = i; // 最右边的最大值
       } 
    }
    if(max_i < min_i) c--;
    return c + nums.length - 1 - max_i + min_i;
};

cpp 解法, 执行用时: 68 ms, 内存消耗: 49.1 MB, 提交时间: 2023-10-17 11:31:50

class Solution {
public:
    int minimumSwaps(vector<int>& nums) {
        if (nums.size() == 1) return 0;
        int iMax, iMin;
        int numMax = INT_MIN, numMin = INT_MAX;
        //找最右边的最大值和最左边的最小值位置
        for (int i = 0; i < nums.size(); ++i) {
            if (nums[i] < numMin) numMin = nums[i];
            if (nums[i] >= numMax) {
                numMax = nums[i];
                iMax = i;
            }
        }

        for (int i = 0; i < nums.size(); ++i) {
            if (nums[i] == numMin) {
                iMin = i;
                break;
            }
        }
        return iMin + nums.size() -1 - iMax + (iMin > iMax ? -1: 0 );
    }
};

golang 解法, 执行用时: 56 ms, 内存消耗: 8.3 MB, 提交时间: 2023-10-17 11:31:30

func minimumSwaps(nums []int) int {
    min, max:= 0, 0
    for i:=0;i< len(nums);i++{
        if nums[i] < nums[min]{
            min = i
        }
        if nums[i] >= nums[max]{
            max =  i
        }
    }
    ans:= min+len(nums)-1-max
    if max < min{
        ans--
    }
    return ans
}

python3 解法, 执行用时: 424 ms, 内存消耗: 29.4 MB, 提交时间: 2023-10-17 11:30:15

class Solution:
    def minimumSwaps(self, nums: List[int]) -> int:
        minv, maxv = min(nums), max(nums) # 最大最小值
        minid, maxid = -1, -1  # 最大最小值索引
        n = len(nums)
        for i in range(n):
            if nums[i] == minv:
                if minid == -1:
                    minid = i
            if nums[i] == maxv:
                maxid = i
        ans = minid - maxid + n - 1
        return ans if minid <= maxid else ans - 1

上一题