LeetCode Beautiful Arrangement
Posted Dylan_Java_NYC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode Beautiful Arrangement相关的知识,希望对你有一定的参考价值。
原题链接在这里:https://leetcode.com/problems/beautiful-arrangement/description/
题目:
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:
- The number at the ith position is divisible by i.
- 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:
- N is a positive integer and will not exceed 15.
题解:
典型的backtracking. 用visited记录用过的位置, 挨个position往后permute. 遇到不合规矩的直接返回, 看能不能走到N.
Time Complexity: exponential. 每次走到最后才遇到不和规矩的backtrack回来.
Space: O(N).
AC Java:
1 class Solution { 2 int res = 0; 3 public int countArrangement(int N) { 4 if(N <= 0){ 5 return 0; 6 } 7 8 boolean [] visited = new boolean[N+1]; 9 dfs(visited, 1, N); 10 return res; 11 } 12 13 private void dfs(boolean [] visited, int pos, int N){ 14 if(pos > N){ 15 res++; 16 return; 17 } 18 19 for(int i = 1; i<=N; i++){ 20 if(!visited[i] && (i%pos==0 || pos%i==0)){ 21 visited[i] = true; 22 dfs(visited, pos+1, N); 23 visited[i] = false; 24 } 25 } 26 } 27 }
以上是关于LeetCode Beautiful Arrangement的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode Beautiful Arrangement II
[LeetCode] Beautiful Arrangement
LeetCode 667: Beautiful Arrangement II
[LeetCode] 932. Beautiful Array 漂亮数组