算法之全排列

给定一个没有重复数字的序列,返回其所有可能的全排列。

示例:

输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

每次都尝试 把一个元素加到队列

class Solution {
        List<List<Integer>>res=new ArrayList<List<Integer>>();
        public List<List<Integer>> permute(int[] nums) {
            for(int i=0;i<nums.length;i++){
                add_to_list(nums, new ArrayList<>(), i, new HashSet<>());
            }
            return res;
        }

        void add_to_list(int[]nums,ArrayList<Integer>cur_list,int added_to_list,HashSet<Integer>hashSet){
            cur_list.add(nums[added_to_list]);
            hashSet.add(nums[added_to_list]);

           if(hashSet.size()<nums.length){
               for(int i=0;i<nums.length;i++){
                   if(!hashSet.contains(nums[i])){
                       add_to_list(nums,new ArrayList<>(cur_list),i,new HashSet<>(hashSet));
                   }
               }
           }
           else {
               res.add(cur_list);
           }
        }


    }

思路:依次遍历每一位, 对于cur_pos上的值可以有 与剩余位置交换和 不交换两种操作

比如:1 2 3
首先 cur pos 上的元素为1,
那么处理后的数组 有1 2 3 2 1 3 3 2 1
然后对于1 2 3 处理 下标为1(num[1]也就是2)的元素
可以得到 1 2 3(不交换)、1 3 2

class Solution {
        List<List<Integer>>res=new ArrayList<List<Integer>>();
        public List<List<Integer>> permute(int[] nums) {
            if (nums == null || nums.length == 0) {
                return res;
            }
            if (nums.length == 1) {
                ArrayList<Integer> list = new ArrayList<>();
                list.add(nums[0]);
                res.add(list);
                return res;
            }

            res.add(to_list(nums));
            swap_cur(nums,0);



            return res;
        }

        void swap_cur(int[]nums,int cur_pos){
            if(cur_pos<nums.length){
                swap_cur(nums,cur_pos+1);
            }
            for(int next_pos=cur_pos+1;next_pos<nums.length;next_pos++){
                //进行了交换
                int tmp=nums[cur_pos];
                nums[cur_pos]=nums[next_pos];
                nums[next_pos]=tmp;

                res.add(to_list(nums));
                swap_cur(nums,cur_pos+1);

                nums[next_pos]=nums[cur_pos];
                nums[cur_pos]=tmp;




            }
        }








    ArrayList<Integer> to_list(int[]nums){
            ArrayList<Integer>cur_list=new ArrayList<>();
            for(int i=0;i<nums.length;i++){
                cur_list.add(nums[i]);
            }
            return cur_list;
    }


    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值