Permutation

Find all => DFS,思路為每次找到以某個元素為開頭,再去遍歷所有其他元素,

所以會遇到又要把自己加進去的情況,我們可以開一個 isVisited array or set(沒重複可以用set) 來避免

[1,2,3] : [1] -> [1,2] -> [1, 2, 3] (第一層結束) ==> backtrack [1] (下一個為3) -> [1, 3] -> [1, 3, 2]

public List<List<Integer>> permute(int[] nums) {

    List<List<Integer>> results = new ArrayList<>();
    if (nums == null) {
        return results;
    }
    if (nums.length == 0) {
        results.add(new ArrayList<Integer>());
        return results;
    }

    boolean[] isVisited = new boolean[nums.length];
    for (int i = 0; i < nums.length; i++) {
        isVisited[i] = false;
    }
    helper(nums, isVisited, new ArrayList<Integer>(), results);
    return results;
}

public void helper(int[] nums, 
                    boolean[] visited, 
                    List<Integer> permutation,
                    List<List<Integer>> results) {
    //end
    if (permutation.size() == nums.length) {
        results.add(new ArrayList<Integer>(permutation));
        return;
    }

    for (int i = 0; i < nums.length; i++) {
        if (visited[i] == false) {
            permutation.add(nums[i]);
            visited[i] = true;
            helper(nums, visited, permutation, results);
            permutation.remove(permutation.size() - 1);
            visited[i] = false;
        }
    }
    return;
}

permutation II 則是要在有重複元素的情況下

那麼跟前面都相同,我們要確保在前面的要先被挑到

if ( i - 1 > 0 && nums[i] == nums[i - 1] && !visited[i - 1]){
    continue;
}

results matching ""

    No results matching ""