给一个公司做网站维护,icp经营性许可证申请条件,关键词seo优化软件,安徽地图文章目录 组合并集问题汇总#xff1a;题目方法一#xff1a;递归回溯去重 组合并集问题汇总#xff1a;
1、子集去重版本 2、组合非去重版本 3、子集非去重版本
题目
相比较46题#xff1a;不需要去重#xff1a;【LeetCode-中等题】46. 全排列
需要做出的改变就是并集问题汇总题目方法一递归回溯去重 组合并集问题汇总
1、子集去重版本 2、组合非去重版本 3、子集非去重版本
题目
相比较46题不需要去重【LeetCode-中等题】46. 全排列
需要做出的改变就是
首先需要对待全排列的数组进行排序为去重操作做准备 Arrays.sort(nums);//对数组进行排序 方便后续进行去重操作在每次进行递归的时候不仅需要判断标志数组是否为true跳过此次还要在i0的并且后一个位置的元素如果和前面一个元素相同并且标志位为false代表未处理那么也跳过此次递归 最后同样是递归和回溯和不去重的代码一样 参考视频讲解回溯算法求解全排列如何去重| LeetCode47.全排列 II 图解全排列无去重版本【LeetCode-中等题】46. 全排列 —无去重
方法一递归回溯去重
class Solution {ListListInteger res new ArrayList();//最后的结果集public ListListInteger permuteUnique(int[] nums) {Arrays.sort(nums);//对数组进行排序 方便后续进行去重操作ListInteger path new ArrayList(); //子结果集boolean[] usered new boolean[nums.length]; //标记数组backtrace(nums,path,usered);return res;}public void backtrace(int[] nums ,ListInteger path ,boolean[] usered){if(path.size() nums.length) {//递归出口子结果集大小 数组大小 res.add(new ArrayList(path));//因为path是实时变化的必须要将path复制到一个新数组再放到res结果集return;}for(int i 0 ; i nums.length ; i){// if(usered[i]) continue;//如果标志位为true 则直接跳过// if(i 0 nums[i] nums[i - 1] !usered[i - 1]) continue;if(usered[i] || (i 0 nums[i] nums[i - 1] !usered[i - 1])) continue;//去重操作else {path.add(nums[i]);//加入子结果集usered[i] true;//将该位置标志位标为true 往下不能取了backtrace(nums,path,usered);//往下面继续递归usered[i] false;//某次递归结束后要回溯回去就得把之前该的标志位还原path.remove(path.size()-1);//某次递归结束后要回溯回去当前path应该把递归之前加的元素给剔除掉}}}
}