首页 > 其他分享 >1806. 还原排列的最少操作步数

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

时间:2023-01-09 11:12:11浏览次数:42  
标签:1806 arr 示例 perm 最少 操作 步数

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

给你一个偶数 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 回到排列初始值,至少需要执行多少步操作?返回最小的 非零 操作步数。

 

示例 1:

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

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

输入:n = 6
输出:4

模拟

class Solution {
public:
    bool is_same(vector<int>arr){
        for(int i=0;i<arr.size();i++)
            if(arr[i]!=i)
                return false;
        return true;
    }

    int reinitializePermutation(int n) {
        vector<int>perm(n);
        vector<int>arr(n);
        for(int i=0;i<n;i++)    perm[i]=i;
        int cnt=1;
        for(int i=0;i<n;i++)
            if(i&1) arr[i]=perm[n/2+(i-1)/2];
            else arr[i]=perm[i/2];
            perm=arr;
        while(!is_same(arr)){
            for(int i=0;i<n;i++)
                if(i&1) arr[i]=perm[n/2+(i-1)/2];
                else arr[i]=perm[i/2];
            perm=arr;
            cnt++;
        }
        return  cnt;
    }
};

标签:1806,arr,示例,perm,最少,操作,步数
From: https://www.cnblogs.com/SkyDusty/p/17036416.html

相关文章