90.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package main
  2. import (
  3. "fmt"
  4. "sort"
  5. )
  6. func minInt(x, y int) int {
  7. if x < y {
  8. return x
  9. }
  10. return y
  11. }
  12. // Int2DSlice ...
  13. type Int2DSlice [][]int
  14. func (p Int2DSlice) Len() int { return len(p) }
  15. func (p Int2DSlice) Less(i, j int) bool {
  16. if len(p[i]) == 0 || len(p[j]) == 0 {
  17. return len(p[i]) == 0
  18. }
  19. bound := minInt(len(p[i]), len(p[j]))
  20. for k := 0; k < bound; k++ {
  21. if p[i][k] != p[j][k] {
  22. return p[i][k] < p[j][k]
  23. }
  24. }
  25. return len(p[i]) < len(p[j])
  26. }
  27. func (p Int2DSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
  28. func subsetsWithDupIter(nums []int, subsets [][]int, subsetsMap map[string]bool) [][]int {
  29. if len(nums) == 0 {
  30. return subsets
  31. }
  32. newSubsets := [][]int{}
  33. for _, set := range subsets {
  34. newSet := append(set, nums[0])
  35. if _, ok := subsetsMap[fmt.Sprint(newSet)]; ok {
  36. continue
  37. }
  38. subsetsMap[fmt.Sprint(newSet)] = true
  39. newSubsets = append(newSubsets, newSet)
  40. }
  41. return subsetsWithDupIter(nums[1:], append(subsets, newSubsets...), subsetsMap)
  42. }
  43. func subsetsWithDup(nums []int) [][]int {
  44. sort.Ints(nums)
  45. subsets := [][]int{[]int{}}
  46. subsetsMap := make(map[string]bool, 0)
  47. result := subsetsWithDupIter(nums, subsets, subsetsMap)
  48. sort.Sort(Int2DSlice(result))
  49. fmt.Println(subsetsMap)
  50. return result
  51. }
  52. func testSubsetsWithDup(nums []int) {
  53. subsets := subsetsWithDup(nums)
  54. fmt.Println("\nThe subsets of", nums, "is", subsets)
  55. }
  56. func main() {
  57. nums := []int{1, 2, 2, 1, 2, 3, 5, 7, 2}
  58. testSubsetsWithDup(nums)
  59. }