【发布时间】: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)。