题目:全排列


给定一个数字列表,返回其所有可能的排列。

您在真实的面试中是否遇到过这个题?

Yes





样例

给出一个列表[1,2,3],其全排列为:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]


挑战

能否不使用递归来实现?
标签 Expand   



相关题目 Expand 
 
解题思路:
ABC   可以看作是先将A分别与BC交换,然后递归,回溯即可
            ABC------->ACB   
ABC    BAC ------>BCA   
           CBA-------->CAB
class Solution {
    /**
     * @param nums: A list of integers.
     * @return: A list of permutations.
     */
    public ArrayList<ArrayList<Integer>> permute(ArrayList<Integer> nums) {
        // write your code here
         ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
         if(null==nums||0==nums.size()) return res;
         dictory(res, nums, 0);
         return res;
    }
    public void dictory(ArrayList<ArrayList<Integer>> res,ArrayList<Integer> nums,int start){
         if(start==nums.size()){
              res.add((ArrayList<Integer>) nums.clone());
         }else{
              for(int i=start;i<nums.size();i++){
                   swap(nums, start, i);
                   dictory(res, nums, start+1);
                   swap(nums, start, i);
              }
         }
    }
    public void swap(ArrayList<Integer> nums ,int s,int e){
         int tmp1 = nums.get(s);
         int tmp2 = nums.get(e);        
         nums.set(s, tmp2);
         nums.set(e, tmp1);
    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值