526.优美的排列

65 阅读1分钟

题目:
假设有从 1 到 n 的 n 个整数。用这些整数构造一个数组 perm下标从 1 开始),只要满足下述条件 之一 ,该数组就是一个 优美的排列 :

  • perm[i] 能够被 i 整除
  • i 能够被 perm[i] 整除

给你一个整数 n ,返回可以构造的 优美排列 的 数量 。
算法:

func countArrangement(n int) int {
	ans := 0
	permFlag := make([]int, n + 1)
	// 安排perm的第index的数
	result := make([]int, 1)
	var backtracking func(index int) 
	backtracking =  func(index int) {
		if index == n + 1 {
			ans ++
			return
		}
		// i是放在perm[i]的值
		for i := 1; i <= n; i ++ {
			if permFlag[i] == 0 && ((index % i == 0) || (i % index == 0)) {
				permFlag[i] = 1
				result = append(result, i)
				backtracking(index + 1)
				result = result[:len(result) - 1]
				permFlag[i] = 0
			}
		}
	}
	backtracking(1)
	return ans
}