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