全排列
话不多说,直接上代码
第一次用hashmap去除,复杂度有点高
class Solution {
public List<List<Integer>> permute(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> res = new LinkedList<>();
if(nums.length==0)return res; //去除特殊情况
Map<Integer, Integer> map = new HashMap<>();
backtrack(res, nums, new LinkedList<Integer>(),map, 0);
return res;
}
public void backtrack(List<List<Integer>> res, int[] nums, List<Integer> result, Map<Integer, Integer> map, int t) {
if(t>=nums.length) {
res.add(new LinkedList<>(result));
return;
}
else {
for(int i=0; i<nums.length; i++) {
if(!map.containsKey(nums[i])) {
map.put(nums[i], i);
result.add(nums[i]);
backtrack(res, nums, result, map, t+1);
map.remove(result.get(result.size()-1));
result.remove(result.size()-1);
}
}
}
}
}
用visited数组,查找更快,时间复杂度比用hashmap低
public void backtrack(List<List<Integer>> res, int[] nums, List<Integer> result, int[] visited, int t) {
if(t>=nums.length) {
res.add(new LinkedList<>(result));
return;
}
else {
for(int i=0; i<nums.length; i++) {
if(visited[i]==0) {
visited[i]=1;
result.add(nums[i]);
backtrack(res, nums, result, visited, t+1);
result.remove(result.size()-1);
visited[i]=0;
}
}
}
}
目标和
遗留问题:此题还可以用dp解?
class Solution {
int count=0;
public int findTargetSumWays(int[] nums, int target) {
Arrays.sort(nums);
// List<List<Integer>> res = new LinkedList<>();
if(nums.length==0)return 0;
backtrack(nums, target, 0, 0);
return count;
}
public void backtrack(int[] nums, int target, int t, int sum) {
if(t>=nums.length) {
if(sum==target) {
count++;
return;
}
}
else {
backtrack(nums, target, t+1, sum+nums[t]); //两次不同的迭代对应+-,每次都探索到数组的最后一个数
backtrack(nums, target, t+1, sum-nums[t]);
}
}
}