【LeetCode】極客時間アルゴリズム方法とコードテンプレートのまとめ(更新中)
一、コードテンプレート
1、再帰
2、分治
3、BFS
4、DFS
4.1再帰
DFSテンプレート:
4.2反復(非再帰表記)
5、二叉木
層順遍歴テンプレートは、上のBFSを参照することができる.
二、問題の書き方
三、参考
1、再帰コードテンプレート2、分治コードテンプレート3、BFSコードテンプレート4、DFSコードテンプレート(再帰表記、非再帰表記)
1、再帰
// Java
public void recur(int level, int param) {
// terminator
if (level > MAX_LEVEL) {
// process result
return;
}
// process current logic
process(level, param);
// drill down
recur( level: level + 1, newParam);
// restore current status
2、分治
private static int divide_conquer(Problem problem, ) {
// terminator
if (problem == NULL) {
int res = process_last_result();
return res;
}
// process current logic:split the big problems
subProblems = split_problem(problem)
// drill down:conquer subproblems, merge subresults
res0 = divide_conquer(subProblems[0])
res1 = divide_conquer(subProblems[1])
result = process_result(res0, res1);
// revert the current level states
return result;
}
3、BFS
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> allResults = new ArrayList<>();
if (root == null) {
return allResults;
}
Queue<TreeNode> nodes = new LinkedList<>();
nodes.add(root);
while (!nodes.isEmpty()) {
int size = nodes.size();
List<Integer> results = new ArrayList<>();
for (int i = 0; i < size; i++) {
TreeNode node = nodes.poll();
results.add(node.val);
if (node.left != null) {
nodes.add(node.left);
}
if (node.right != null) {
nodes.add(node.right);
}
}
allResults.add(results);
}
return allResults;
}
4、DFS
4.1再帰
DFSテンプレート:
voidDFS ( Vertex V )
{
visited[V] = true;
for( V W )
if( !visited[W] )
DFS( W );
}
public List<List<Integer>> levelOrder(TreeNode root) {
if(root==null) return allResults;
List<List<Integer>> allResults = new ArrayList<>();
travel(root, 0, allResults);
return allResults;
}
private void travel(TreeNode root, int level, List<List<Integer>> results){
// process current node here.
if(results.size()==level) results.add(new ArrayList<>());
results.get(level).add(root.val);
if(root.left!=null) travel(root.left, level+1, results);
if(root.right!=null) travel(root.right, level+1, results);
}
4.2反復(非再帰表記)
void dfs(TreeNode root) {
if(root!=null) return ;
Set<Integer> visited = new HashSet<>();
stack<TreeNode> stackNode;
stackNode.push(root);
while (!stackNode.isEmpty()) {
TreeNode node = stackNode.pop();
if(visited.contains(node.val)) continue; // already visited
visited.add(node.val);
for (int i = node.children.length() - 1; i >= 0; --i) {
stackNode.push(node.children[i]);
}
}
return ;
}
5、二叉木
層順遍歴テンプレートは、上のBFSを参照することができる.
二、問題の書き方
三、参考
1、再帰コードテンプレート2、分治コードテンプレート3、BFSコードテンプレート4、DFSコードテンプレート(再帰表記、非再帰表記)