LeetCode 46 Permutations

題目

Given a collection of distinct integers, return all possible permutations.

Example:
Input: [1,2,3]
Output:

[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

解法思路(一)

  • 排列的問(wèn)題;
  • 回溯法;
  • 當(dāng)給出輸入的數(shù)組,代表整個(gè)排列組合的樹(shù)就已經(jīng)形成了,如下:

????
算法過(guò)程.png
  • 問(wèn)題轉(zhuǎn)換成了,求這棵樹(shù)中,所有從根節(jié)點(diǎn)到空節(jié)點(diǎn)的路徑;
排列和組合的區(qū)別
  • 排列的遞歸樹(shù)是這樣的:當(dāng)選中一個(gè)元素后,下一個(gè)元素只要不是這個(gè)元素就行;
  • 組合的遞歸樹(shù)是這樣的:當(dāng)選中一個(gè)元素后,下一個(gè)元素只能是選中元素之后的元素;

解法實(shí)現(xiàn)(一)

關(guān)鍵字

回溯 遞歸 樹(shù) 樹(shù)的路徑 排列

實(shí)現(xiàn)細(xì)節(jié)
  • 由于樹(shù)上每一層的邊是有沖突的,上層的邊用過(guò)的數(shù)字,下層的邊就不能再用了,所以在回溯的過(guò)程中,要將邊的狀態(tài)置為可用;
  • 已經(jīng)確定的排列組合在往 res 中放的時(shí)候,要注意是深拷貝,否則遞歸過(guò)程中找到的組合保存不下來(lái);
  • 用一個(gè)輔助數(shù)組 used 記錄每個(gè)數(shù)字是否可選的狀態(tài);
package leetcode._46;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Solution46_1 {

    private List<List<Integer>> res;
    private boolean[] used;

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

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

        used = new boolean[nums.length];
        LinkedList<Integer> combination = new LinkedList<>();

        findCombination(nums, 0, combination);

        return res;
    }

    private void findCombination(int[] nums, int index, LinkedList<Integer> combination) {

        if (index == nums.length) {
            res.add((List<Integer>)combination.clone());
            return;
        }

        for (int i = 0; i < nums.length; i++) {
            if (!used[i]) {
                combination.addLast(nums[i]);
                used[i] = true;
                findCombination(nums, index + 1, combination);
                combination.removeLast();
                used[i] = false;
            }
        }

        return;
    }

}

返回 LeetCode [Java] 目錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容