39.組み合わせとインタビューの質問の組み合わせの感覚

 今日、問題は非常に深刻です。会議は、バックトラッキングアルゴリズムを含め、実際にはあいまいであると思います。バックトラッキングアルゴリズムについて最も重要なことは、状態の一時停止、状態の要約、開始の兆候です。最初に、最初の質問、制限は数です合計が目標であり、許容される条件は、配列内の要素を無制限に読み取ることができることですが、ソリューションセットは繰り返すことができないため、各ラウンドをフィルタリングするためのラベルを設定することができます。コードは次のとおりです。

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Deque;
import java.util.List;

public class Solution {

    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> res = new ArrayList<>();
        int len = candidates.length;

        // 排序是为了提前终止搜索
        Arrays.sort(candidates);

        dfs(candidates, len, target, 0, new ArrayDeque<>(), res);
        return res;
    }

    /**
     * @param candidates 数组输入
     * @param len        输入数组的长度,冗余变量
     * @param residue    剩余数值
     * @param begin      本轮搜索的起点下标
     * @param path       从根结点到任意结点的路径
     * @param res        结果集变量
     */
    private void dfs(int[] candidates,
                     int len,
                     int residue,
                     int begin,
                     Deque<Integer> path,
                     List<List<Integer>> res) {
        if (residue == 0) {
            // 由于 path 全局只使用一份,到叶子结点的时候需要做一个拷贝
            res.add(new ArrayList<>(path));
            return;
        }

        for (int i = begin; i < len; i++) {

            // 在数组有序的前提下,剪枝
            if (residue - candidates[i] < 0) {
                break;
            }

            path.addLast(candidates[i]);
            dfs(candidates, len, residue - candidates[i], i, path, res);
            path.removeLast();

        }
    }
}

各ラウンドはiです。つまり、すべてのラウンドは同じ場所から始まります。それが見つからない場合は、次のラウンドであるi + 1に進みます。

 

 

そして二番目の質問!制限は主に長さであり、文字列を読み取る必要があります。これは、生成された文字列の長さが元の文字列と同じであるということと同じですが、各要素は1回しか読み取ることができません。制限付きで、一度に1つしか読み取ることができません。訪問済み配列を使用して要素にマークを付け、要素が読み取られたときにマークを付け、ネストされた読み取りを実行します。ループの条件は、訪問済み配列のトラバーサルの場合、毎回1つも見つからないことです。マークされたvisited配列は問題ありませんが、0から始まるたびに、すべての文字列を段階的に形成する方法を尋ねる人がいます、答えは次のとおりです。文字列の長さの制限。長さが0の場合は0から始まります。長さが1の場合は0から始まります。長さが1の場合は、1つの長さのスクリーニングで上層から文字を選択します。コードは次のとおりです。

    public String[] permutation(String s) {
        if(s.equals("")) return new String[0];
        char[] schars=s.toCharArray();
        boolean[] visited=new boolean[schars.length];
        Set<String>set=new HashSet<>();
            dfs_per(set,"",visited,schars);

        String[] res=  new String[set.size()];
               return set.toArray(res);
 
    }
    public void dfs_per(Set<String>res,String str,boolean[] visited,char[] sc){
        if(str.length()==sc.length){
            res.add(new String(str));
            System.out.println(str);
            return;
        }
        
        for(int i=0;i<sc.length;i++){
            if(visited[i]==true) continue;
            visited[i]=true;
            dfs_per(res,str+sc[i],visited,sc);
            visited[i]=false;
        }
    }

    つまり、各ループの最後で、前のレイヤーのループを見つけたときに、このレイヤーのトラバーサルマークを持ち上げてから、前のレイヤーの既定の要素を0から1に変更してから、1をマークして検索します。 、すべての要素をトラバースするタスクを完了します!

元の記事を17件公開しました 賞賛されました0 訪問数155

おすすめ

転載: blog.csdn.net/qq_33286699/article/details/104999105