链接 :Leetcode 46
依然是分而治之的思想,将大问题转化为小问题进行处理。
注意: 边界条件,采用迭代形式写函数时需要注意迭代出口的设计
但这个版本效率不是很高
import java.util.ArrayList;
import java.util.List;
public class Solution {
public static void main(String[] args){
int[] nums ={1,2,3};
List<List<Integer>> result = permute(nums);
System.out.println(result);
}
public static List<List<Integer>> permute(int[] nums){
//if(nums.length==0) return null;
int len = nums.length;
List<List<Integer>> result = new ArrayList<List<Integer>>();
List<Integer> copy = new ArrayList<Integer>();
for(int i=0;i<=len-1;i++){
copy.add(nums[i]);
}
result = permute_n(copy);
/*
for(int i=0;i<=len-1;i++){
List<Integer> element = new ArrayList<Integer>();
element.add(nums[i]);
List<List<Integer>> permutelist = permute_n(nums,i);
for(List<Integer> elem: permutelist){
element.addAll(elem);
result.add(element);
}
}
*/
return result;
}
public static List<List<Integer>> permute_n(List<Integer> nums){
int len = nums.size();
List<List<Integer>> result = new ArrayList<List<Integer>>();
if(len==1) {
result.add(nums);
return result;
}
for(int i=0;i<=len-1;i++){
List<Integer> copy = new ArrayList<Integer>();
copy.addAll(nums);
copy.remove(i);
List<List<Integer>> permutelist = permute_n(copy);
for(List<Integer> elem: permutelist){
List<Integer> element = new ArrayList<Integer>();
element.add(nums.get(i));
element.addAll(elem);
result.add(element);
}
}
return result;
}
}
参考文章 solution : 代码
import java.util.ArrayList;
import java.util.List;
public class Solution {
public String getPermutation(int n, int k) {
int pos = 0;
List<Integer> numbers = new ArrayList<>();
int[] factorial = new int[n+1];
StringBuilder sb = new StringBuilder();
// create an array of factorial lookup
int sum = 1;
factorial[0] = 1;
for(int i=1; i<=n; i++){
sum *= i;
factorial[i] = sum;
}
// factorial[] = {1, 1, 2, 6, 24, ... n!}
// create a list of numbers to get indices
for(int i=1; i<=n; i++){
numbers.add(i);
}
// numbers = {1, 2, 3, 4}
k--;
for(int i = 1; i <= n; i++){
int index = k/factorial[n-i];
sb.append(String.valueOf(numbers.get(index)));
numbers.remove(index);
k-=index*factorial[n-i];
}
return String.valueOf(sb);
}
}
自己写的代码,看来代码还是要自己写。
import java.util.ArrayList;
import java.util.List;
public class Solution {
public String getPermutation(int n, int k) {
int[] factorial = new int[n+1];
factorial[0] = 1;
int sum = 1;
for(int i =1;i<=n;i++){
sum = sum*i;
factorial[i] = sum;
}
//factorial = {1,1,2,6,24,120,...}
k--;
String result="";
List<Integer> num = new ArrayList<Integer>();
for(int i=1;i<=n;i++){
num.add(i);
}
//num = {1,2,3,4}
for(int i=1;i<=n;i++){
int index = k/factorial[n-i];
result += String.valueOf(num.get(index));
num.remove(index);
k -= index*factorial[n-i];
}
return result;
}
}