欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

leetcode-回溯算法

时间:2023-06-10
全排列 II

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

这个题目在全排列Ⅰ的基础上多了去重这一步。

class Solution { boolean [] visited; public List> permuteUnique(int[] nums) { visited=new boolean[nums.length]; Arrays.sort(nums); List> res=new ArrayList<>(); List path =new ArrayList<>(); backtrack(nums,0,res,path);return res; } public void backtrack(int []nums,int idx,List> res,List path ){ if(idx==nums.length){ res.add(new ArrayList<>(path)); } for(int i=0;i0&&nums[i]==nums[i-1]&&!visited[i-1]){ continue; } path.add(nums[i]){ visited[i]==true; backtrack(nums,idx+1,res,path); visited[i]=false; path.remove(path.size()-1); } } } }

组合总和 II

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次 。

注意:解集不能包含重复的组合。

class Solution { private List> res = new ArrayList<>(); public List> combinationSum2(int[] candidates, int target) { List path =new ArrayList<>(); Arrays.sort(candidates); bactrack(path,candidates,target,0); return res; } private void backtrack(List path,int[] candidates,int target,int idx) { if(target==0){ res.add(new ArrayList<>(path)); } for(int i=idx;iidx&&candidates[i]==candidates[i-1]) continue; int num=target-candidates[i]; if(num>=0){ path.add(candidates[i]); backtrack(path,candidates,num,idx+1); path.remove(path.size()-1); } else{ return; } } }}

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。