LeetCodeブラシの質問T46フルアレンジメント(中)

みなさん、こんにちは。今回は、LeetCodeのT46フルアレイ(中)のトピックについて説明します。前の質問:
ここに画像の説明を挿入
問題解決のアイデア:
この問題では、バックトラッキングアルゴリズムを使用し、すべてのバックトラッキング問題を解決する必要があります。これは実際には意思決定ツリーの問題です。理解できない場合は、例を挙げましょう。
最初
ここに画像の説明を挿入
に画像を見ることができます。次の画像から:[1,2,3]が一連のソリューションを作成し、私に従って分析します:
1 :最初に選択された1。
2:次に、1、2、3を選択できますが、1を選択しますが、1が選択されているため(numが繰り返されていない配列)、戻ることしかできません。つまり、1-> 1はクロスです
3:次に、 1-> 2
を選択4:1-> 2 を選択すると、1、2、3を選択できます。1を選択すると、1-> 2-> 1になりますが、1が選択されている場合は、戻る必要があります。 、1-> 2-> 2が可能かどうかを確認しますが、2が選択されています。3、1-> 2-> 3を選択できるかどうかを確認しましょう、はい。
上記の分析の後、いわゆるバックトラッキングが出てきます。実際、これは本質的に決定ツリーです。ツリーのブランチは選択(決定)を表します。つまり、前のステップに戻ります。
では、どのようにアルゴリズムを設計するのでしょうか?
私はまだ上記の画像
ここに画像の説明を挿入
アルゴリズムの設計アイデアを採用しています:
1:パスを表すトラックを定義し、そのトラックを使用してパスを記録します。トラックの次数がnumsの長さに等しい場合、これは順列の1つであることを意味します。
2:nums配列の番号は繰り返すことができないため、トラックに表示されている番号は、トラックに存在する番号に分岐する必要がないことを表しています。たとえば、上記のように、1-> 1の場合、track [1 ] 1つあります。上の図は、3値演算を使用して、存在する場合はそれを示し、存在しない場合はバックトラックを使用してトラックに追加します。これは、現在、最終的な配置のコンポーネントであることを示しています。
3:上記の説明と上記の図によると、アルゴリズムの設計アイデアを得ることができます。これは図の一部にすぎないため、再帰的な方法を採用しています。
次のコード:

class Solution {
    //返回结果
    List<List<Integer>> res = new  LinkedList<List<Integer>>(); //表示结果

    public List<List<Integer>> permute(int[] nums) {
        LinkedList<Integer> track=new LinkedList<>(); //表示当前的路径
        backtrack(nums,track);  //数组和当前的走过的路径放进去 递归函数
        return res;
    }

    // 递归函数
    public void backtrack(int[] nums,LinkedList<Integer> track){
        //递归的结束条件,track的长度和数组长度相等,则说明当前track为一次排列
        if(track.size()==nums.length){
            res.add(track);
            return;
        }

        //判断条当前决策是否能添加进track 
        for(int i=0;i<nums.length;i++){
            if(track.contains(nums[i])){ //因为数组无重复数字,说明此数字已经用过,此路不通 
                continue;  
            }
            track.add(nums[i]); //添加进当前的路径
            backtrack(nums,track);//保存当前的看路径继续递归
            track.removeLast();  //取消track的最后一个,也就是返回上一次的决策。
        }
    }
}

この質問はもっと難しいです。写真を注意深く組み合わせて、再帰、意思決定、バックトラックの概念を理解して、理解を深める必要があります。
ここに画像の説明を挿入
ハハは少しひどいです!より良いアイデアがあれば、下にメッセージを残してください!みんなを助けたいです!ありがとうございました!

おすすめ

転載: blog.csdn.net/Pzzzz_wwy/article/details/105759196