【问题标题】:How can I find the minimum number of swaps in a consecutive unordered array (vector)?如何找到连续无序数组(向量)中的最小交换次数?
【发布时间】:2019-12-27 23:35:50
【问题描述】:

我正在尝试解决一个问题:

给你一个由连续整数 [1, 2, 3, ..., n] 组成的无序数组,没有任何重复,也没有特定的顺序。你可以交换任意两个元素。您需要找到按升序对数组进行排序所需的最小交换次数。

约束:

  • 元素的数量必须 >= 1
  • 数组中的元素必须

我的代码在数字不在正确位置时有效,但当元素在正确位置时它进入无限循环,示例数组:[1 3 5 2 4 6 7]

我的代码:

#include <iostream>
#include <vector>

void swap(int &a, int &b)
{
    int temp = a;
    a = b;
    b = temp;
}

int minimumSwaps(std::vector<int> arr)
{
    int numberOfSwaps = 0;
    int lastElementIndex = (arr.size() - 1);

    bool isSwapping = true;

    while (isSwapping)
    {
        isSwapping = false;
        for (int i = 0; i < arr.size(); i++)
        {
            if (lastElementIndex - (arr.size() - arr[i]) != 0)
            {
                isSwapping = true;
                swap(arr[i], arr[lastElementIndex - (arr.size() - arr[i])]);
                numberOfSwaps++;
            }
            else
            {
                std::cout << arr[i] << " is already in its perfect position." << std::endl;
                
            }
        }
    }

    return numberOfSwaps;
}

P.S:我刚刚使用 else 语句检查出了什么问题。

【问题讨论】:

  • 与问题无关:可以使用std::swap
  • @ThomasSablik 谢谢!
  • if (lastElementIndex - (arr.size() - arr[i]) != 0) 等价于if (arr[i] - 1 != 0)。我不明白如果条件。请描述你的算法。
  • @ThomasSablik 例如 [1 3 5 2 4 6 7],lastElementIndex 始终为 6,因此 if (lastElementIndex - (arr.size() - arr[i]) 与 6 - (7 - 1) = 0 相同,当 arr[i] == 1 ,值 0 意味着它不需要更改,这就是为什么我只在它不同于 0 时使用swap(),所以循环中的i 不应该增加并抓住下一个元素来检查它是否在正确的位置?
  • 您应该将lastElementIndex 替换为其常量值(arr.size() - 1)。然后你得到if ((arr.size() - 1) - (arr.size() - arr[i]) != 0) 那就是if (arr[i] != 1)

标签: c++ sorting


【解决方案1】:

lastElementIndex 替换为其值(arr.size() - 1)

排队

if (lastElementIndex - (arr.size() - arr[i]) != 0)

产量

if ((arr.size() - 1) - (arr.size() - arr[i]) != 0)

这相当于

if (arr[i] != 1)

这显然是错误的。用

替换该行
if (arr[i] - 1 != i)

【讨论】:

    猜你喜欢
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多