问题1:递增子序列
题目:
思路:
剪枝这里控制顺序是递增的
代码:
java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
public class 递增子序列 {
public static void main(String[] args) {
System.out.println(findSubsequences(new int[]{1,2,3,4,5,6,7,8,9,10,1,1,1,1,1}));
}
static List<List<Integer>> res = new LinkedList<>();
static LinkedList<Integer> list = new LinkedList<>();
static int [] used;
public static List<List<Integer>> findSubsequences(int[] nums) {
used = new int[nums.length];
trackback(nums,0);
return res;
}
public static void trackback(int[] nums, int startindex) {
if (list.size() > 1) {
res.add(new ArrayList<>(list));
}
HashMap<Integer,Integer> lhy = new HashMap<>();
for (int i = startindex; i < nums.length; i++){
// 剪支
if (lhy.containsKey(nums[i])||(!list.isEmpty() && nums[i] < list.peekLast()) ){
continue;
}
lhy.put(nums[i],lhy.getOrDefault(nums[i],0)+1);
list.offer(nums[i]);
used[i] = nums[i];
trackback(nums, i+1);
list.pollLast();
}
}
}
问题2:全排列
题目:
思路:
集合的简化版 无需多言
代码:
java
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class 全排列 {
public static void main(String[] args) {
System.out.println(permute(new int[]{1,2,3}));
}
static List<List<Integer>> res = new LinkedList<>();
static List<Integer> list = new LinkedList<>();
static boolean []used;
public static List<List<Integer>> permute(int[] nums) {
used = new boolean[nums.length];
trackback(nums,used);
return res;
}
public static void trackback(int[] nums, boolean [] used){
if (list.size() == nums.length){
res.add(new LinkedList<>(list));
return;
}
for (int i = 0; i < nums.length; i++){
if (used[i] == false){
used[i] = true;
list.add(nums[i]);
trackback(nums,used);
used[i] = false;
list.remove(list.size()-1);}
}
}
}
问题3:全排列II
题目:
思路:
借助used数组剪支
代码:
java
import java.util.LinkedList;
import java.util.List;
public class 全排列II {
public static void main(String[] args) {
System.out.println(permute(new int[]{1,2,3}));
}
static List<List<Integer>> res = new LinkedList<>();
static List<Integer> list = new LinkedList<>();
static boolean []used;
public static List<List<Integer>> permute(int[] nums) {
used = new boolean[nums.length];
trackback(nums,used);
return res;
}
public static void trackback(int[] nums, boolean [] used){
if (list.size() == nums.length){
res.add(new LinkedList<>(list));
return;
}
for (int i = 0; i < nums.length; i++){
if (i > 0 && nums[i] == nums[i-1] && used[i-1] == false){
continue;
}
if (used[i] == false){
used[i] = true;
list.add(nums[i]);
trackback(nums,used);
used[i] = false;
list.remove(list.size()-1);}
}
}
}