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


    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10403153.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★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 }
  • 相关阅读:
    Info.plist的秘密(raywenderlich笔记)
    我所理解的性能测试中负载测试与压力测试的区别
    seo优化
    localStorage,sessionStorage那些事儿
    浏览器cookie那些事儿
    JavaScript--Ajax请求
    javascript-理解原型、原型链
    React Native:从入门到原理
    知道这 20 个正则表达式,能让你少写 1,000 行代码
    程序猿进化必读:让App的运行速度与响应速度趋于一流(iOS)
  • 原文地址:https://www.cnblogs.com/strengthen/p/10403153.html
Copyright © 2020-2023  润新知