90.go 674 B

123456789101112131415161718192021222324252627282930
  1. package main
  2. import (
  3. "sort"
  4. )
  5. func subsetsWithDup(nums []int) [][]int {
  6. sort.Ints(nums)
  7. subsets := [][]int{[]int{}}
  8. for i, cnt := 0, 0; i < len(nums); i += cnt {
  9. for cnt = 1; cnt+i < len(nums) && nums[cnt+i] == nums[i]; cnt++ {
  10. // count the number of same elements
  11. }
  12. preLen := len(subsets)
  13. for j := 0; j < preLen; j++ {
  14. subset := make([]int, len(subsets[j]))
  15. copy(subset, subsets[j]) // deep copy, not create slice (!!!)
  16. for k := 0; k < cnt; k++ {
  17. subset = append(subset, nums[i])
  18. subsets = append(subsets, subset)
  19. }
  20. }
  21. }
  22. return subsets
  23. }
  24. // func main() {
  25. // nums := []int{1, 2, 2, 3, 4}
  26. // fmt.Println(subsetsWithDup(nums))
  27. // }