2021-07-27:给定一个数组arr,长度为N,arr中的值只有1,2,3三种。arr[i] == 1,代表汉诺塔问题中,从上往下第i个圆盘目前在左;arr[i] == 2,代表汉诺塔问题中,从上

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-07-27:给定一个数组arr,长度为N,arr中的值只有1,2,3三种。arr[i] == 1,代表汉诺塔问题中,从上往下第i个圆盘目前在左;arr[i] == 2,代表汉诺塔问题中,从上相关的知识,希望对你有一定的参考价值。

2021-07-27:给定一个数组arr,长度为N,arr中的值只有1,2,3三种。arr[i] == 1,代表汉诺塔问题中,从上往下第i个圆盘目前在左;arr[i] == 2,代表汉诺塔问题中,从上往下第i个圆盘目前在中;arr[i] == 3,代表汉诺塔问题中,从上往下第i个圆盘目前在右。那么arr整体就代表汉诺塔游戏过程中的一个状况。如果这个状况不是汉诺塔最优解运动过程中的状况,返回-1。如果这个状况是汉诺塔最优解运动过程中的状况,返回它是第几个状况。

福大大 答案2021-07-27:

1-7的汉诺塔问题。

  1. 1-6左→中。
  2. 7左→右。
  3. 1-6中→右。
    单决策递归。
    k层汉诺塔问题,是[2的k次方-1]步。
    时间复杂度:O(N)。
    空间复杂度:O(1)。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
    arr := []int{3, 3, 3}
    if true {
        ret := kth(arr)
        fmt.Println("递归:", ret)
    }
    if true {
        ret := kth2(arr)
        fmt.Println("迭代:", ret)
    }
}

func kth(arr []int) int {
    N := len(arr)
    return step(arr, N-1, 1, 3, 2)
}

// 0...index这些圆盘,arr[0..index] index+1层塔
// 在哪?from 去哪?to 另一个是啥?other
// arr[0..index]这些状态,是index+1层汉诺塔问题的,最优解第几步
func step(arr []int, index int, from int, to int, other int) int {
    if index == -1 {
        return 0
    }
    if arr[index] == other {
        return -1
    }
    if arr[index] == from {
        return step(arr, index-1, from, other, to)
    } else {
        p1 := (1 << index) - 1
        p2 := 1
        p3 := step(arr, index-1, other, to, from)
        if p3 == -1 {
            return -1
        }
        return p1 + p2 + p3
    }
}

func kth2(arr []int) int {
    if len(arr) == 0 {
        return -1
    }
    from := 1
    mid := 2
    to := 3
    i := len(arr) - 1
    res := 0
    tmp := 0
    for i >= 0 {
        if arr[i] != from && arr[i] != to {
            return -1
        }
        if arr[i] == to {
            res += 1 << i
            tmp = from
            from = mid
        } else {
            tmp = to
            to = mid
        }
        mid = tmp
        i--
    }
    return res
}

执行结果如下:


左神java代码

以上是关于2021-07-27:给定一个数组arr,长度为N,arr中的值只有1,2,3三种。arr[i] == 1,代表汉诺塔问题中,从上往下第i个圆盘目前在左;arr[i] == 2,代表汉诺塔问题中,从上的主要内容,如果未能解决你的问题,请参考以下文章

2022-08-22:给定一个数组arr,长度为n,最多可以删除一个连续子数组, 求剩下的数组,严格连续递增的子数组最大长度。 n <= 10^6。 来自字节。5.6笔试。

2021-08-03:完美洗牌问题。给定一个长度为偶数的数组arr,假设长度为N*2,左部分:arr[L1……Ln],右部分: arr[R1……Rn],请把arr调整成arr[L1,R1,L2,R2,

2022-08-06:给定一个数组arr,长度为N,arr中所有的值都在1~K范围上, 你可以删除数字,目的是让arr的最长递增子序列长度小于K。 返回至少删除几个数字能达到目的。 N <= 10^4

给定一个长度为 n 的数组,找到子集的 XOR 等于给定数字的子集数

给定一个长度为 n 的数组,找到子集的 XOR 等于给定数字的子集数

2022-01-12:给定一个正数数组arr,长度为n,下标0~n-1, arr中的0n-1位置不需要达标,它们分别是最左最右的位置, 中间位置i需要达标,达标的条件是 : arr[i-1] >