用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);
}
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。