算法经典题目:Permutations

题目 1

给定一个不同的整数的集合,返回所有可能的排列

示例:

Input: [1,2,3]
Output:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

解题思路:

求出⼀个数组的排列组合中的所有排列,⽤ DFS 深搜即可。

答案:

func permute(nums []int) [][]int {
if len(nums) == 0 {
 return [][]int{}
 }
 used, p, res := make([]bool, len(nums)), []int{}, [][]int{}
 generatePermutation(nums, 0, p, &res, &used)
 return res
}
func generatePermutation(nums []int, index int, p []int, res *[][]int, used *
[]bool) {
 if index == len(nums) {
 temp := make([]int, len(p))
 copy(temp, p)
 *res = append(*res, temp)
 return
 }
 for i := 0; i < len(nums); i++ {
 if !(*used)[i] {
 (*used)[i] = true
 p = append(p, nums[i])
 generatePermutation(nums, index+1, p, res, used)
 p = p[:len(p)-1]
 (*used)[i] = false
 }
 }
 return
}

题目 2

给定一个可能包含重复项的数字集合,返回所有可能的唯一排列。

示例:

Input: [1,1,2]
Output:
[
[1,1,2],
[1,2,1],
[2,1,1]
]

解题思路:

这⼀题是第 46 题的加强版,第 46 题中求数组的排列,数组中元素不重复,但是这⼀题中,数组
元素会重复,所以需要最终排列出来的结果需要去重。
去重的⽅法是经典逻辑,将数组排序以后,判断重复元素再做逻辑判断。
其他思路和上题完全⼀致,DFS 深搜即可。

答案:

func permuteUnique(nums []int) [][]int {
 if len(nums) == 0 {
 return [][]int{}
 }
 used, p, res := make([]bool, len(nums)), []int{}, [][]int{}
 sort.Ints(nums) // 这⾥是去重的关键逻辑
 generatePermutation47(nums, 0, p, &res, &used)
 return res
}
func generatePermutation47(nums []int, index int, p []int, res *[][]int, used
*[]bool) {
 if index == len(nums) {
    temp := make([]int, len(p))
    copy(temp, p)
    *res = append(*res, temp)
 return
 }
 for i := 0; i < len(nums); i++ {
   if !(*used)[i] {
    if i > 0 && nums[i] == nums[i-1] && !(*used)[i-1] { // 这⾥是去重的关键逻辑
     continue
    }
    (*used)[i] = true
    p = append(p, nums[i])
    generatePermutation47(nums, index+1, p, res, used)
    p = p[:len(p)-1]
    (*used)[i] = false
  }
 }
 return
}

🚀 获取更多详细资料可点击链接进群领取,谢谢支持👇

点击免费领取更多资料

  • 12
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值