建设银行淮安招聘网站,做整装的网站,仿制网站的后台,seo成功案例分析47.全排列II 主要需要解决全排列不重复的问题#xff0c;设定一个规则#xff0c;保证在填第i个数的时候重复数字只会被填入一次即可#xff0c;而在本题中#xff0c;我们选择对原数组排序#xff0c;保证相同的数字都相邻#xff0c;然后每次填入的数一定是这个数所在重…47.全排列II 主要需要解决全排列不重复的问题设定一个规则保证在填第i个数的时候重复数字只会被填入一次即可而在本题中我们选择对原数组排序保证相同的数字都相邻然后每次填入的数一定是这个数所在重复数集合中「从左往右第一个未被填过的数字」
class Solution {public ListListInteger permuteUnique(int[] nums) {ListListInteger res new ArrayListListInteger();ListInteger tmp new ArrayListInteger();int n nums.length;boolean[] visites new boolean[n];Arrays.sort(nums);backtrack(res,tmp,visites,nums);return res;}public void backtrack(ListListInteger res,ListInteger tmp,boolean[] visites,int[] nums){if(tmp.size() nums.length){res.add(new ArrayList(tmp));return;}for(int i 0; i nums.length; i){ //由于会有重复,保证在填第i个数的时候重复数组只会被填入一次即可//选择对原数字排序保证相同的数字都相邻然后每次填入的数一定是这个数所在重复数集合中从左往后第一个未被填过的数字//!visites[i-1]限制两个相邻的重复数字的访问顺序//比如[1,1,2]保证左边的1永远比右边的1先使用/* vis[i]当前数字是否出现过* 如果当前数字与前一个数字相同nums[i] nums[i - 1]* 并且前一个数字还没有出现的话vis[i - 1] false* 那么就不能选择当前数字continue* 如果前面的数字已经出现过vis[i] true则可以* 选择当前数字*/if(visites[i] || ( i0 nums[i] nums[i -1] !visites[i-1])){continue;}tmp.add(nums[i]);visites[i] true;backtrack(res,tmp,visites,nums);tmp.remove(tmp.size()-1);visites[i]false;}}
}