zoukankan      html  css  js  c++  java
  • 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;
            }
        }
    }

    换一种写法居然能变快

  • 相关阅读:
    uva 10561 sg定理
    二进制下 求分数化小数的循环节问题
    zoj 2562 反素数
    uva 11916 解模方程a^x=b (mod n)
    Android 组件化方案探索与思考
    2018谷歌I/O开发者大会8大看点汇总 新品有哪些
    Glide高级详解—缓存与解码复用
    Android性能优化:手把手带你全面实现内存优化
    Android几种强大的下拉刷新库
    Android app 在线更新那点事儿(适配Android6.0、7.0、8.0)
  • 原文地址:https://www.cnblogs.com/wentiliangkaihua/p/13606040.html
Copyright © 2011-2022 走看看