491.递增子序列
题目链接:https://leetcode.cn/problems/non-decreasing-subsequences/
var findSubsequences = function(nums) {
let result = []
let path = []
function backtracing(startIndex) {
if(path.length > 1) {
result.push(path.slice())
}
let uset = []
for(let i = startIndex; i < nums.length; i++) {
if((path.length > 0 && nums[i] < path[path.length - 1]) || uset[nums[i] + 100]) {
continue
}
uset[nums[i] + 100] = true
path.push(nums[i])
backtracing(i + 1)
path.pop()
}
}
backtracing(0)
return result
};
解题思路
1.本题最主要核心的一点是不能先给所给的数组排序,其次要进行层级去重
2.如果选取的值小于path中的最后一个值则去掉。
3.同一层中如果再次出现和之前一样的元素,也pass掉这一情况
4.uset主要用来将取过的数放入,再次在遍历的时候如果遇到则直接砍掉这种情况。
46.全排列
题目链接:https://leetcode.cn/problems/permutations/
var permute = function(nums) {
let path=[],res=[]
function backtracking(nums,used){
if(nums.length===path.length){
res.push([...path])
return
}
for(let i=0;i<nums.length;i++){
if(used[i]===true)continue
path.push(nums[i])
used[i]=true
backtracking(nums,used)
used[i]=false
path.pop()
}
}
backtracking(nums,[])
return res
};
解题思路
1.此道题为排列,考虑顺序和组合问题不同,used用来记录遍历过哪一个,每次选取完元素后,再从剩下的所有元素中选取元素,而不是只从选取的元素后面选取元素
2.其余遵从回溯三部曲来即可。
47.全排列Ⅱ
题目链接:https://leetcode.cn/problems/permutations-ii/
var permuteUnique = function(nums) {
nums.sort((a,b)=>{
return a-b
}
)
let res=[],path=[]
function backtracking(nums,used){
if(path.length===nums.length){
res.push([...path])
}
for(let i=0;i<nums.length;i++){
if(i>0&&nums[i]===nums[i-1]&&!used[i-1]){
continue
}
if(used[i]===true) continue
used[i]=true
path.push(nums[i])
backtracking(nums,used)
path.pop()
used[i]=false
}
}
backtracking(nums,[])
return res
};
解题思路
1.本题给定的数组中包含重复元素,因此一定要排序,让相同的元素紧挨着。
2.要进行树层的剪枝。
3.其他依旧安装回溯三部曲进行一步一步写即可。