yankewei / LeetCode

LeetCode 问题的解决方法
MIT License
6 stars 0 forks source link

还原排列的最少操作步数 #127

Open yankewei opened 3 years ago

yankewei commented 3 years ago

给你一个偶数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

提示:

yankewei commented 3 years ago

模拟

func reinitializePermutation(n int) int {
    var ret int
    perm := make([]int, n)
    origin := make([]int, n)
    for i := 0; i < n; i++ {
        perm[i] = i
    origin[i] = i
    }
    for {
    arr := make([]int, n)
    for i, _ := range perm {
        if i % 2 == 0 {
        arr[i] = perm[i/2]
        } else {
        arr[i] = perm[n/2 + (i-1)/2]
        }
    }
    perm = arr
    ret++
    if isEqual(origin, perm) {
        return ret
    }
    }
}

func isEqual(f,s []int) bool {
    for i, v := range s {
    if v != f[i] {
        return false
    }
    }
    return true
}