当前位置: 首页 > 知识库问答 >
问题:

用C++求解最小交换hackerrank问题

慕弘义
2023-03-14

我有一个关于Hackerrank最小交换问题的问题。

基本上,问题是找到排序数组所需的交换数。

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;


}

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

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

共有1个答案

西门建安
2023-03-14

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

 类似资料:
  • 本文向大家介绍使用C语言实现最小生成树求解的简单方法,包括了使用C语言实现最小生成树求解的简单方法的使用技巧和注意事项,需要的朋友参考一下 最小生成树Prim算法朴素版 有几点需要说明一下。 1、2个for循环都是从2开始的,因为一般我们默认开始就把第一个节点加入生成树,因此之后不需要再次寻找它。 2、lowcost[i]记录的是以节点i为终点的最小边权值。初始化时因为默认把第一个节点加入生成树,

  • 如何学习? 0)单元测试 1)最小化问题 2)带着疑问学习 3)反复区分状态,语境 4)培养成就感 想想本文是如何带你这样玩的?

  • 本文向大家介绍解决Tomcat修改get提交请求乱码问题,包括了解决Tomcat修改get提交请求乱码问题的使用技巧和注意事项,需要的朋友参考一下 1:表单提交controller获得中文参数后乱码解决方案 注意: jsp页面编码设置为UTF-8 ***************form表单提交方式为必须为post,get方式下面spring编码过滤器不起效果 修改web.xml,增加编码过滤器,如

  • 我正在研究最小堆实现,对这个概念非常陌生。 以此作为参考:< br > https://www.geeksforgeeks.org/building-heap-from-array/ https://algorithm tutor . com/Data-Structures/Tree/Binary-Heaps/ 我修改了代码并想出了: (这是我遇到问题的代码,所有其他代码都与我的问题无关,至少我是

  • 第一次: Hackerrank抛出错误,因为不是函数。我还尝试了和,但都无济于事。 我尝试了:

  • 本文向大家介绍C++交换指针实例,包括了C++交换指针实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C++交换指针的方法。分享给大家供大家参考。具体分析如下: 通常情况下,我们只是对普通数据进行交换,交换指针的问题很少涉及,这里总结下,也方便我们以后查阅。 首先看下整型两个数据的交换(这个比较简单,就不多介绍了),核心代码如下: 指针是内存地址,应该也算是整型变量,交换两个指针和交换