标签:
这个题和组合很像,但是排列需要把所有的可能都列出来,所以不需要记住位置,每一层都是从0开始循环。相应的,它需要一个数组,在每一层的时候把是否加过这个数字记下来,最后remove的时候需要把这个flag归位。
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>> result = new ArrayList<ArrayList<Integer>>(); if(nums == null || nums.size() == 0){ return result; } ArrayList<Integer> list = new ArrayList<Integer>(); permuteHelper(result, list, nums, new boolean[nums.size()]); return result; } private void permuteHelper(ArrayList<ArrayList<Integer>> result, ArrayList<Integer> list, ArrayList<Integer> nums, boolean[] used){ if (list.size() == nums.size()){ result.add(new ArrayList<Integer>(list)); return; } for(int i = 0; i < nums.size(); i++){ if(used[i]){ continue; } used[i] = true; list.add(nums.get(i)); permuteHelper(result, list, nums, used); list.remove(list.size() - 1); used[i] = false; } } }
(这个题还有非recursive的做法,需要再看)
标签:
原文地址:http://www.cnblogs.com/codingEskimo/p/5782582.html