为有牺牲多壮志,敢教日月换新天。

[Swift]LeetCode526. 优美的排列 | Beautiful Arrangement

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10403153.html 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

Suppose you have N integers from 1 to N. We define a beautiful arrangement as an array that is constructed by these N numbers successfully if one of the following is true for the ith position (1 <= i <= N) in this array:

  1. The number at the ith position is divisible by i.
  2. i is divisible by the number at the ith position. 

Now given N, how many beautiful arrangements can you construct?

Example 1:

Input: 2
Output: 2
Explanation: 

The first beautiful arrangement is [1, 2]:
Number at the 1st position (i=1) is 1, and 1 is divisible by i (i=1).
Number at the 2nd position (i=2) is 2, and 2 is divisible by i (i=2).
The second beautiful arrangement is [2, 1]:
Number at the 1st position (i=1) is 2, and 2 is divisible by i (i=1).
Number at the 2nd position (i=2) is 1, and i (i=2) is divisible by 1. 

Note:

  1. N is a positive integer and will not exceed 15.

假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这个数组为一个优美的排列。条件:

  1. 第 i 位的数字能被 i 整除
  2. i 能被第 i 位上的数字整除

现在给定一个整数 N,请问可以构造多少个优美的排列?

示例1:

输入: 2
输出: 2
解释: 

第 1 个优美的排列是 [1, 2]:
  第 1 个位置(i=1)上的数字是1,1能被 i(i=1)整除
  第 2 个位置(i=2)上的数字是2,2能被 i(i=2)整除

第 2 个优美的排列是 [2, 1]:
  第 1 个位置(i=1)上的数字是2,2能被 i(i=1)整除
  第 2 个位置(i=2)上的数字是1,i(i=2)能被 1 整除

说明:

  1. N 是一个正整数,并且不会超过15。

Runtime: 52 ms
Memory Usage: 18.5 MB
 1 class Solution {
 2     func countArrangement(_ N: Int) -> Int {
 3         var nums:[Int] = [Int](repeating:0,count:N)
 4         for i in 0..<N
 5         {
 6             nums[i] = i + 1
 7         }
 8         return helper(N, &nums)
 9     }
10     
11     func helper(_ n:Int,_ nums:inout [Int]) -> Int
12     {
13         if n <= 0 {return 1}
14         var res:Int = 0
15         for i in 0..<n
16         {
17             if n % nums[i] == 0 || nums[i] % n == 0
18             {
19                 (nums[i], nums[n - 1]) = (nums[n - 1], nums[i])
20                 res += helper(n - 1, &nums)
21                 (nums[i], nums[n - 1]) = (nums[n - 1], nums[i])
22             }
23         }
24         return res
25     }
26 }

424ms

 1 class Solution {
 2     func countArrangement(_ N: Int) -> Int {
 3         var used = [Bool](repeating: false, count: N + 1)
 4         var result = 0
 5         backtrack(1, N, &used, &result)
 6         return result
 7     }
 8     
 9     private func backtrack(_ position: Int, _ n: Int, _ used: inout [Bool], _ result: inout Int) {
10         if position > n {
11             result += 1
12         } else {
13             for i in 1...n where !used[i] && (position % i == 0 || i % position == 0) {
14                 used[i] = true
15                 backtrack(position + 1, n, &used, &result)
16                 used[i] = false
17             }
18         }
19     }
20 }

452ms

 1 class Solution {
 2     var count = 0
 3     func countArrangement(_ N: Int) -> Int {
 4         var elements: [Bool] = Array(repeating: false, count: N)
 5         createNext(elements: &elements, position: 1, n: N)
 6         return count;
 7     }
 8     
 9     func createNext(elements: inout [Bool], position: Int, n: Int) {
10         if position > n {
11             count += 1
12             return
13         }
14         for i in 0..<elements.count {
15             if !(!elements[i] && ( position % (i+1) == 0 || (i+1) % position == 0)) { continue; }
16             elements[i] = true;
17             createNext(elements: &elements, position: position+1, n: n)
18             elements[i] = false
19         }
20     }
21 }

536ms

 1 class Solution {
 2     func countArrangement(_ N: Int) -> Int {
 3       guard N > 0 else { return 0 }
 4       
 5       var visited = Array.init(repeating: 0, count: N + 1)
 6       var count = 0
 7       func dfs(position: Int) {
 8         
 9         if position > N {
10           count += 1
11           return
12         }
13         
14         for i in 1..<(N+1) {
15           if visited[i] == 0 && (i % position == 0 || position % i == 0) {
16             visited[i] = 1
17             dfs(position: position + 1)
18             visited[i] = 0
19           }
20         }
21         
22       }
23       
24       dfs(position: 1)
25       return count
26     }
27 }

820ms

 1 class Solution {
 2     func countArrangement(_ N: Int) -> Int {
 3         var num = 0
 4         var mark = Array(repeatElement(0, count: N + 1))
 5         insertNum(N: N, index: 1, mark: &mark, result: &num)
 6         return num
 7     }
 8     
 9     func insertNum(N: Int, index: Int, mark: inout [Int], result: inout Int) {
10         if N == index - 1 {
11             result += 1
12             return
13         }
14         
15         for j in 1...N {
16             if mark[j] == 0 && (j % index == 0 || index % j == 0) {
17                 mark[j] = 1
18                 insertNum(N: N, index: index + 1, mark: &mark, result: &result)
19                 mark[j] = 0
20             }
21         }
22     }
23 }

 

posted @ 2019-02-19 20:10  为敢技术  阅读(326)  评论(0编辑  收藏  举报