算法训练营day25(补),回溯5

package main

import "sort"

491. 非递减子序列

func findSubsequences(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) {

    if len(path) > 1 {

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

      copy(temp, path)

      result = append(result, temp)

    }

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

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

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

      if user[numList[i]] {

        continue

      }

      if len(path) == 0 || numList[i] >= path[len(path)-1] {

        path = append(path, numList[i])

        user[numList[i]] = true

        backtrace(numList, i+1)

        //回溯处理

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

      }

    }

  }

  backtrace(nums, 0)

  return result

}

46. 全排列

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

  //存储全部集合

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

  if len(nums) == 0 {

    return result

  }

  //存储单次集合

  path := make([]int, 0)

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

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

  var backtrace func(numList []int, user map[int]bool)

  backtrace = func(numList []int, user map[int]bool) {

    if len(path) == len(numList) {

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

      copy(temp, path)

      result = append(result, temp)

    }

    //因为是组合所有元素又要

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

      if user[numList[i]] { //已用过的数直接跳过

        continue

      }

      path = append(path, numList[i])

      user[numList[i]] = true

      backtrace(numList, user)

      //回溯处理

      user[numList[i]] = false

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

    }

  }

  backtrace(nums, user)

  return result

}

47. 全排列 II

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

  //存储全部集合

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

  if len(nums) == 0 {

    return result

  }

  sort.Ints(nums)

  //存储单次集合

  path := make([]int, 0)

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

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

  var backtrace func(numList []int, user map[int]bool)

  backtrace = func(numList []int, user map[int]bool) {

    if len(path) == len(numList) {

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

      copy(temp, path)

      result = append(result, temp)

    }

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

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

        continue

      }

      if user[i] { //已用过的数直接跳过

        continue

      }

      path = append(path, numList[i])

      user[i] = true

      backtrace(numList, user)

      //回溯处理

      user[i] = false

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

    }

  }

  backtrace(nums, user)

  return result

}

相关推荐

  1. 算法训练day25(),回溯5

    2024-02-15 20:26:05       40 阅读
  2. 算法训练day24回溯4-1

    2024-02-15 20:26:05       34 阅读
  3. 算法训练day23

    2024-02-15 20:26:05       7 阅读
  4. 算法训练Day29(回溯

    2024-02-15 20:26:05       40 阅读
  5. 算法训练day22, 回溯2

    2024-02-15 20:26:05       34 阅读
  6. 算法训练day27(),贪心算法1

    2024-02-15 20:26:05       27 阅读
  7. 算法训练day28(), 贪心算法2

    2024-02-15 20:26:05       32 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-15 20:26:05       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-15 20:26:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-15 20:26:05       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-15 20:26:05       20 阅读

热门阅读

  1. UVA1449 Dominating Patterns 题解

    2024-02-15 20:26:05       31 阅读
  2. git错误整理

    2024-02-15 20:26:05       29 阅读
  3. ES实战-高级聚合

    2024-02-15 20:26:05       29 阅读
  4. linux系统zabbix监控自定义监控

    2024-02-15 20:26:05       33 阅读
  5. 力扣-344. 反转字符串

    2024-02-15 20:26:05       24 阅读
  6. TDC - Crisis/Phobia - 4 types of Crisis

    2024-02-15 20:26:05       29 阅读
  7. Spring Cloud Ribbon:负载均衡

    2024-02-15 20:26:05       26 阅读
  8. centos7.9 搭建k8s

    2024-02-15 20:26:05       34 阅读
  9. 盘点五种常用的数据加密技术

    2024-02-15 20:26:05       29 阅读