【问题标题】:Solving Minimum swaps hackerrank question in C++在 C++ 中解决最小交换黑客等级问题
【发布时间】:2019-10-16 20:03:04
【问题描述】:

我对 Hackerrank 上的最小交换问题有疑问。

基本上,问题是找出对数组进行排序所需的交换次数。

数组不包含任何重复的元素。

这是我的代码,但我似乎得到了错误的答案。特别是,我得到了向量 temp 数组长度的 4 倍。

int minimumSwaps(vector<int> arr) {

int n = arr.size();
int count_swap = 0;

vector<int> temp;

for(int i = 0; i < n; ++i){
    cout << temp.size()<<"\n";
    if(arr[i] == i+1){

        temp.push_back(arr[i]);
    }

    else{

        int initial_val = arr[i];

        int next_val = arr[arr[i] - 1];

        temp.push_back(initial_val);

        while(next_val != initial_val){

            temp.push_back(next_val);

            next_val = arr[next_val - 1];

            count_swap += 1;
            }
        }
    if (temp.size() == n){
        break;
    }      

}
print(temp);
return count_swap;


}

我的方法是在数组中找到一个循环循环,所需的最小交换次数是该数字 - 1。

例如,如果我们有 arr = [2,3,4,1,5]

2 -> 3 -> 4 -> 1 -> 2

所以有一个长度为 4 的循环。因此所需的最小交换是 4-1 =3。 (由于其他 5 个已经到位并且循环长度 =1,因此需要 0 个交换)。

【问题讨论】:

    标签: c++ algorithm data-structures


    【解决方案1】:

    算法迭代向量中的每个元素,然后继续确定该元素处的循环。因此,它四次遇到第一个周期。该算法应该可能会迭代向量中的循环。

    【讨论】:

    • 这就是我添加if temp.size() == n break的原因
    • 您的 for 循环在每次迭代中将索引 i 递增 1。如果它改为递增它以使索引指向下一个周期的开始,那可能会给出您正在寻找的结果。
    • 是的,我同意,但因此我在下一行设置了 if 条件,以便在 temp.size 达到原始数组大小时脱离整个循环,这意味着所有元素都已被访问。
    猜你喜欢
    • 2022-07-29
    • 2021-11-15
    • 2019-11-03
    • 1970-01-01
    • 2020-09-07
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    相关资源
    最近更新 更多