LeetCode 47. Permutations II

    技术2024-12-20  7

    https://leetcode-cn.com/problems/permutations-ii/solution/hui-su-suan-fa-python-dai-ma-java-dai-ma-by-liwe-2/

    对于这个解法,我还有另一个视角的理解。在对nums排序以后,我们考虑几个相同的数,如果排在某个数前面的数还未被使用(used[i - 1] == false),那么我们不得使用该数。其实这里所做的工作就是强行给这几个相同的数做了出现次序规定:一定要前面的数加入到path以后,才能再添加后面的数。所以得到的结果一定不会重复,我们因此实现了剪枝。

    举个例子:nums = [1', 1'', 1''', 2], 我们通过上面的方式规定了1' -> 1'' -> 1'''的出场次序,所以有了[1', 1'', 1''', 2]以后一定不会有[1'', 1, 1''', 2] 或者 [1''', 1'', 1', 2]等等重复的解。

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

     

    Processed: 0.046, SQL: 9