• 526. Beautiful Arrangement


    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.
    public class Solution {
        int count = 0;
        
        public int countArrangement(int N) {
            if (N == 0) return 0;
            helper(N, 1, new int[N + 1]);
            return count;
        }
        
        private void helper(int N, int pos, int[] used) {
            if (pos > N) {
                count++;
                return;
            }
            
            for (int i = 1; i <= N; i++) {
                if (used[i] == 0 && (i % pos == 0 || pos % i == 0)) {
                    used[i] = 1;
                    helper(N, pos + 1, used);
                    used[i] = 0;
                }
            }
        }
    }

    看清楚dfs里面谁在变谁不变:变得是pos,不变的是for循环的界限

    public class Solution {
        public int countArrangement(int N) {
            dfs(N, N, new boolean[N + 1]);
            return count;
        }
        
        int count = 0;
        
        void dfs(int N, int k, boolean[] visited) {
            if (k == 0) {
                count++;
                return;
            }
            for (int i = 1; i <= N; i++) {
                if (visited[i] || k % i != 0 && i % k != 0) {
                    continue;
                }
                visited[i] = true;
                dfs(N, k - 1, visited);
                visited[i] = false;
            }
        }
    }

    换一种写法居然能变快

  • 相关阅读:
    PCI 设备详解二
    PCI 设备详解一
    SKBUFFER详解
    windows中的进程和线程
    sVIrt概述
    qemu网络虚拟化之数据流向分析二
    在VC6的debug框里面输出版权信息
    [yii]Trying to get property of non-object
    yii使用CFrom调用ajax失败的记录
    VC代码生成里面的/MT /MTd /MD /MDd的意思
  • 原文地址:https://www.cnblogs.com/wentiliangkaihua/p/13606040.html
Copyright © 2020-2023  润新知