题意:

image.png

解题思路:

  1. 思路:
  2. 1. 先排序,让相同的元素前后排一起;
  3. 2. 同一层级,前后相同,则跳出:前后相同指的是对应的索引值


图示:

未命名文件 (48).png

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param Integer[] $nums
  4. * @return Integer[][]
  5. */
  6. public $res = [];
  7. function subsetsWithDup($nums) {
  8. sort($nums);
  9. $this->dfs([], $nums, 0);
  10. return $this->res;
  11. }
  12. function dfs($array, $nums, $start) {
  13. array_push($this->res, $array);
  14. for ($i = $start; $i < count($nums); $i++) {
  15. if ($i != $start && $nums[$i] == $nums[$i - 1]) {
  16. continue;
  17. }
  18. array_push($array, $nums[$i]);
  19. $this->dfs($array, $nums, $i + 1);
  20. array_pop($array);
  21. }
  22. }
  23. }

GO代码实现:

  1. var res [][]int
  2. func subsetsWithDup(nums []int) [][]int {
  3. res = make([][]int, 0)
  4. sort.Ints(nums)
  5. dfs([]int{}, nums, 0)
  6. return res
  7. }
  8. func dfs(array, nums []int, start int) {
  9. tmp := make([]int, len(array))
  10. copy(tmp, array)
  11. res = append(res, tmp)
  12. for i := start; i < len(nums); i++ {
  13. if i > start && nums[i] == nums[i - 1] {
  14. continue;
  15. }
  16. array = append(array, nums[i])
  17. dfs(array, nums, i + 1)
  18. array = array[:len(array) - 1]
  19. }
  20. }