ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

算法训练营day24(补),回溯4-2

2026/9/14 7:14:33 拓冰建站 浏览量
算法训练营day24(补),回溯4-2

import (

  "fmt"

  "sort"

)

78. 子集

func subsets(nums []int) [][]int {

  //存储全部集合

  result := make([][]int, 0)

  if len(nums) == 0 {

    return result

  }

  //存储单次集合

  path := make([]int, 0)

  var backtrace func(numList []int, startIndex int)

  backtrace = func(numList []int, startIndex int) {

    temp := make([]int, len(path))

    copy(temp, path)

    result = append(result, temp)

    if startIndex >= len(numList) {

      return

    }

    for i := startIndex; i < len(numList); i++ {

      path = append(path, numList[i])

      backtrace(numList, i+1)

      path = path[:len(path)-1]

    }

  }

  backtrace(nums, 0)

  return result

}

90. 子集 II

func subsetsWithDup(nums []int) [][]int {

  //存储全部集合

  result := make([][]int, 0)

  if len(nums) == 0 {

    return result

  }

  sort.Ints(nums) //排序后面做剪枝

  //记录数组每一个元素是否使用过

  user := make([]bool, len(nums))

  //存储单次集合

  path := make([]int, 0)

  var backtrace func(numList []int, startIndex int)

  backtrace = func(numList []int, startIndex int) {

    temp := make([]int, len(path))

    copy(temp, path)

    result = append(result, temp)

    if startIndex >= len(numList) {

      return

    }

    for i := startIndex; i < len(numList); i++ {

      if i > 0 && numList[i] == numList[i-1] && user[i-1] == false { //过滤重复

        continue

      }

      path = append(path, numList[i])

      user[i] = true

      backtrace(numList, i+1)

      //回溯处理

      path = path[:len(path)-1]

      user[i] = false

    }

  }

  backtrace(nums, 0)

  return result

}

func main() {

  nums := []int{1, 2, 2}

  res := subsetsWithDup(nums)

  fmt.Println(res)

}