leetcode 1806. 还原排列的最少操作步数

news/2024/7/20 22:44:38 标签: leetcode, 算法, 深度优先

题目链接:leetcode 1806

1.题目

给你一个偶数 n​​​​​​ ,已知存在一个长度为 n 的排列 perm ,其中 perm[i] == i​(下标 从 0 开始 计数)。
一步操作中,你将创建一个新数组 arr ,对于每个 i :
如果 i % 2 == 0 ,那么 arr[i] = perm[i / 2]
如果 i % 2 == 1 ,那么 arr[i] = perm[n / 2 + (i - 1) / 2]
然后将 arr​​ 赋值​​给 perm 。
要想使 perm 回到排列初始值,至少需要执行多少步操作?返回最小的 非零 操作步数。

2.示例

1)示例 1:
输入:n = 2
输出:1
解释:最初,perm = [0,1]
第 1 步操作后,perm = [0,1]
所以,仅需执行 1 步操作

2)示例 2:
输入:n = 4
输出:2
解释:最初,perm = [0,1,2,3]
第 1 步操作后,perm = [0,2,1,3]
第 2 步操作后,perm = [0,1,2,3]
所以,仅需执行 2 步操作

3)示例 3:
输入:n = 6
输出:4

4)提示:
2 <= n <= 1000
n​​​​​​ 是一个偶数

3.分析

我们以n=6为例,可以发现无论perm数组如何变化,arr数组每个下表对应perm数组的下标是不会变化的,那么对应关系如下:
0:0
1:3
2:1
3:4
4:2
5:5
我们以下标1为例子,从最初arr[1]=perm[3]逐步推,可以发现下标的顺序分别为:3,4,2,1,到最后arr[1]=perm[1]=1,所以问题转化为求最小环的长度

4.代码

class Solution {
public:
    map<int,int> map1;
    int ans=0;
    void get_dfs(int x){
        ans++;
        if(map1[x]==1) return;
        get_dfs(map1[x]);
    }
    int reinitializePermutation(int n) {
        for(int i=1;i<n;i++)
            if(i%2==0) map1[i]=i/2;
            else map1[i]=n/2+(i-1)/2;
        get_dfs(1);return ans;
    }
};
// 0:0
// 1:3
// 2:1
// 3:4
// 4:2
// 5:5
// 6:3

http://www.niftyadmin.cn/n/5382342.html

相关文章

Django后端开发——静态文件

文章目录 参考资料静态文件什么是静态文件静态文件配置 - settings.py中静态文件访问方案1 - 直接拼接访问路径static目录下test_static.htmlviews.pyurls.py效果 方案2 - 通过{% static %}标签访问静态文件test_static.html效果 小结 参考资料 B站网课&#xff1a;点击蓝色字…

找出作弊的人

文章目录 题目描述输入描述输出描述样例1解释:样例2代码 题目描述 公司组织了一次考试,现在考试结果出来了&#xff0c;想看一下有没人存在作弊行为,但是员工太多了,需要先对员工进行一次过滤,再进一步确定是否存在作弊行为。 过滤的规则为:找到分差最小的员工ID对(p1,p2)列表…

Python函数全解析:一网打尽所有知识点

函数的简介&#xff1a; 函数封装⼀个⼩功能,减少重复代码,实现⼩功能 函数如何减少代码的重复&#xff1f; 例如&#xff1a;start0end10sum0for i in range(start,end):sumiprint(f {sum}) strart,end 是参数&#xff1b;range 是函数打印出0-10之间的偶数和 打印出0-10之间…

Facebook Horizon:探索虚拟现实中的社交空间

随着科技的不断进步&#xff0c;虚拟现实&#xff08;VR&#xff09;技术正成为社交互动和娱乐体验的新前沿。在这个数字时代&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;正在引领虚拟社交的新时代&#xff0c;其推出的虚拟社交平台Facebook Horizon成为了…

0206-2-运输层

第 5 章 运输层 运输层协议概述 进程之间的通信 运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。两个主机进行通信实际上就是两个主机中的应用进程互相通信。应用进程之间的通信又称为端到端的通信。运输…

Fabric中的溯源方法

背景 在Fabric链码中&#xff0c;我们可以使用PutState方法对一个key的值进行覆盖&#xff0c;当我们再使用GetState查询时是最新的值。如果我们希望找到这个key的修改记录&#xff0c;我们可以使用溯源方法GetHistoryForKey。完整源码链接&#xff1a;https://github.com/hyp…

K8S部署MySQL主从环境

1.创建mysql主从环境的命名空间 [rootk8s-master1 mysql]# kubectl create ns mysql namespace/mysql created2.创建master的pvc [rootk8s-master1 mysql]# cat mysql-master-pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata:name: mysql-pvcnamespace: mysql…

已经打包好了的vue dist文件夹,如何用electron打包成exe桌面应用

先在项目根目录下&#xff08;非dist根目录&#xff09;安装electron electron-packager npm install electron再在项目根目录下&#xff08;非dist根目录&#xff09;安装electron-packager npm install electron-packager 然后在dist文件夹下创建main.js文件,内容为 cons…