leetcode之路---递归回溯

本文探讨了使用递归回溯法解决LeetCode中的全排列问题。通过一个具体的例子,详细解释了如何求解数组nums的全排列,并分享了思考过程和代码实现。全排列问题是典型的回溯算法应用,通过逐个尝试并将当前数字放入结果数组中,再递归处理剩余元素,最后得到所有可能的排列组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

把所有涉及到递归回溯的题目写在这篇文章之中

每日一题

2021/09/12 全排列

题目要求

全排列
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

思考过程

这个题目刚看到,这种有大量子问题,也就是说除掉一个元素,求数组里边其他元素的全排列,最后再把这个数字加回去的想法,自然而然就会想到直接递归,但是实际再写的过程中还是会有一些思路上的不熟悉的地方,主要是在怎么组合出最后的结果的[][]int这一块出现了卡顿的情况,看了看题解,需要把某个数扣掉,我的直接想法其实是用一个数字开头

代码

func permute(nums []int) [][]int {
	var ret [][]int
	if len(nums)==1{
		return [][]int{nums}
	}
	for i, num := range nums {
		// 把num从 nums 拿出去 得到tmp
		tmp := make([]int, len(nums)-1)
		k,j:=0,0
        for j<len(tmp){
            if k!=i{
                tmp[j]=nums[k]
                j++
            }
            k++
        }

		// sub 是把num 拿出去后,数组中剩余数据的全排列
		sub := permute(tmp)
		for _, s := range sub {
			ret = append(ret, append(s, num))
		}
	}
	return ret
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值