用combination的思想,加上题目的特殊意思,来解决问题。

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.

如果3个数字,有3种结果。
[1, 2, 3]
[2, 1, 3]
[3, 2, 1]
3
这里对Leetcode原题多加了一个输出的要求,代码如下。
public Solution{
    int count = 0;

    public int countArrangement(int N) {
        if (N == 0) return 0;
        helper(N, 1, new int[N + 1], new ArrayList<Integer>());
        return count;
    }

    private void helper(int N, int pos, int[] used, List<Integer> list) {
        if (pos > N) {
            count++;
            System.out.println(list.toString());
            return;
        }

        for (int i = 1; i <= N; i++) {
            if (used[i] == 0 && (i % pos == 0 || pos % i == 0)) {
                used[i] = 1;
                list.add(i);
                helper(N, pos + 1, used, list);
                list.remove(list.size()-1);
                used[i] = 0;
            }
        }
    }
}

254 Factor Combinations

比如给出的数字是12,质因数分解的结果如下:
[
  [2, 6],
  [2, 2, 3],
  [3, 4]
]
public class Solution {
    public List<List<Integer>> getFactors(int n) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        if(n <= 3) return res;
        dfs(n, res, new ArrayList<Integer>(), -1);
        return res;
    }
    
    public void dfs(int n, List<List<Integer>> res, List<Integer> path, int lower){
        // 和一般combination不同的是,每一步都要导入到结果中。
        if(lower != -1){
            path.add(n);
            res.add(new ArrayList<>(path));
            path.remove(path.size()-1);
        }
        
        // lower 是为了解决重复分解的问题,比如12 = 2*2*3 = 3*2*2,但是后一个是重复的, 所以分解之后factor不能变小。
        // upper 也是为了去重,12 = 3*4 = 4*3, 两个分解的解法是对称的,乘法对称的重点就是sqrt(n).
        int upper = (int) Math.sqrt(n);
        for(int i=Math.max(2, lower); i<= upper; i++){
            if(n%i == 0){
                path.add(i);
                dfs(n/i, res, path, i);
                path.remove(path.size()-1);
            }
        }
    }
}

大米中的大米
12 声望5 粉丝

你的code是面向面试编程的,收集和整理leetcode discussion里个人认为的最优且最符合我个人思维逻辑的解法。