力扣46.全排列

力扣46.全排列


helper函数设计参数说明

  1. List numList:给定需要排列的所有数字,相当远原题中的nums数组,换成list类型的原因:
    ①最终要返回的list中,每一个元素都是List类型,最后一步返回时,可直接将numList作为参数传入
    ②回溯前后需要将数字序列的某两位先交换、再复原,list类型可做参数,直接调用Collections.swap函数
  2. List<List> ans:一般思路的递归会有返回参数,每次递归返回当前子问题的结果。而这一题①处可直接得到一个分支的完整解,而不是某一分支中递归最底层子问题的解,因此增加该参数,使得在①处直接添加解,而不必将递归子问题的解层层返回到最顶层,再经过合并子解得到一个分支的完整解。
public class Leetcode {

    public static List<List<Integer>> permute(int[] nums) {
        if(nums.length==0) return new ArrayList<>();
        List<List<Integer>> ans = new ArrayList<>();
        List<Integer> numList = new ArrayList<>();
        for (int i : nums) {
			numList.add(i);
		}
        helper(numList, ans, 0);
        return ans;
    }
    
    public static void helper(List<Integer> numList, List<List<Integer>> ans, int start){
    	if(start==numList.size()-1){
    		ans.add(new ArrayList<>(numList));	//① (注意此处不能直接add(numList),list为引用传参,后续递归时修改numList会导致前面的变动,因此必须新建一个list对象,相当于复制一个副本)
    	}else{
    		for(int i=start; i<numList.size(); i++){
    			Collections.swap(numList, start, i);	//②
    			helper(numList, ans, start+1);
    			Collections.swap(numList, start, i);
    		}
    	}
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值