Idiot-maker

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

https://oj.leetcode.com/problems/permutations/

Given a collection of numbers, return all possible permutations.

For example,
[1,2,3] have the following permutations:
[1,2,3][1,3,2][2,1,3][2,3,1][3,1,2], and [3,2,1].

解题思路:

一道枚举出所有组合的题目,和前面的Letter Combinations of a Phone Number很相似。可以用DFS和BFS两种方法来求解。

所谓DFS,就是带backtracking的递归。BFS则是迭代。这里和电话号码的题目不同的是,一个组合内的号码不能重复。所以在DFS中,用了个visited的数组来记录哪些数字已经出现过。在BFS中,每次看前面的currentList里是否已经有当前数字。

特别要注意,BFS的时候,从resultList里get出来的list不能直接add完再塞进resultList里,因为拿出来的是引用,这样所有的list都指向一个对象了。

public class Solution {
    public List<List<Integer>> permute(int[] num) {
        List<List<Integer>> resultList = new ArrayList<List<Integer>>();
        List<Integer> currentList = new ArrayList<Integer>();
        if(num.length == 0){
            return resultList;
        }
        int[] visited = new int[num.length];
        // dfs(num, visited, resultList, currentList, 0);
        // return resultList;
        return bfs(num);
    }
    
    public List<List<Integer>> bfs(int[] num){
        List<List<Integer>> resultList = new ArrayList<List<Integer>>();
        resultList.add(new ArrayList<Integer>());
        for(int i = 0; i < num.length; i++){
            List<List<Integer>> currentResultList = new ArrayList<List<Integer>>();
            for(int j = 0; j < num.length; j++){
                for(int k = 0; k < resultList.size(); k++){
                    List<Integer> currentList = new ArrayList(resultList.get(k));
                    //不能写成List<Integer> currentList = resultList.get(k)
                    //否则对currentList的更改也都影响resultList前面的值,非常重要!!!
                    if(!currentList.contains(num[j])){
                        currentList.add(num[j]);
                        currentResultList.add(currentList);
                    }
                }
            }
            resultList = currentResultList;
        }
        return resultList;
    }
    
    public void dfs(int[] num, int[] visited, List<List<Integer>> resultList, List<Integer> currentList, int depth){
        if(currentList.size() == num.length){
            resultList.add(new ArrayList(currentList));
            return;
        }
        for(int i = 0; i < num.length; i++){
            if(visited[i] == 0){
                currentList.add(num[i]);
                visited[i] = 1;
                dfs(num, visited, resultList, currentList, depth + 1);
                currentList.remove(currentList.size() - 1);
                visited[i] = 0;
            }
        }
    }
}

 http://blog.csdn.net/linhuanmars/article/details/21569031

posted on 2015-03-07 15:35  NickyYe  阅读(276)  评论(0编辑  收藏  举报