diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 3fdb97a..0000000 --- a/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule "_includes/_root"] - path = _includes/_root - url = https://github.com/tg123/leetcode.git - branch = gh-pages diff --git a/3sum-closest/index.md b/3sum-closest/index.md index b002b14..a61508f 100644 --- a/3sum-closest/index.md +++ b/3sum-closest/index.md @@ -4,6 +4,4 @@ title: 3Sum Closest date: 2014-12-29 00:26:24 +0800 leetcode_id: 16 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/3sum/index.md b/3sum/index.md index 672d40d..9dd6a94 100644 --- a/3sum/index.md +++ b/3sum/index.md @@ -4,6 +4,4 @@ title: 3Sum date: 2015-02-16 11:19:43 +0800 leetcode_id: 15 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/4sum/index.md b/4sum/index.md index 525eb28..eee2d52 100644 --- a/4sum/index.md +++ b/4sum/index.md @@ -4,6 +4,4 @@ title: 4Sum date: 2014-12-29 00:26:24 +0800 leetcode_id: 18 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/Gemfile b/Gemfile index 053c27d..f85f962 100644 --- a/Gemfile +++ b/Gemfile @@ -1,2 +1,7 @@ source 'https://rubygems.org' -gem 'github-pages' + +require 'json' +require 'open-uri' +versions = JSON.parse(open('https://pages.github.com/versions.json').read) + +gem 'github-pages', versions['github-pages'] diff --git a/_config.yml b/_config.yml index bacb619..8383411 100644 --- a/_config.yml +++ b/_config.yml @@ -1,6 +1,6 @@ -title: Leetcode solutions by tgic +title: LeetCode solutions by tgic email: farmer1992@gmail.com -description: "Leetcode solutions by tgic" +description: "LeetCode java solutions by tgic" github_username: tg123 markdown: redcarpet diff --git a/_includes/_root b/_includes/_root deleted file mode 160000 index 5288343..0000000 --- a/_includes/_root +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5288343aefc316b99043a4e93107b53960c3fb2c diff --git a/_layouts/solution.html b/_layouts/solution.html index 40448c2..ab32238 100644 --- a/_layouts/solution.html +++ b/_layouts/solution.html @@ -2,8 +2,7 @@ layout: default --- {% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_source = {{leetcode_name | append: '/Solution.java' | prepend: '_root/'}} %} -{% assign leetcode_url = {{leetcode_name | prepend: 'https://oj.leetcode.com/problems/'}} %} +{% assign leetcode_url = {{leetcode_name | prepend: 'https://leetcode.com/problems/'}} %} {% assign github_url = {{leetcode_name | prepend: 'https://github.com/tg123/leetcode/blob/gh-pages/' }} %} {% assign github_source_url = {{leetcode_name | prepend: 'https://github.com/tg123/leetcode/blob/gh-pages/' | append: '/Solution.java' }} %} @@ -22,7 +21,7 @@

{{ page.title }}

Source code Read on Github

{% highlight java linenos %} -{% include {{leetcode_source}} %} +{% include_relative Solution.java %} {% endhighlight %}
diff --git a/add-and-search-word-data-structure-design/README.md b/add-and-search-word-data-structure-design/README.md new file mode 100644 index 0000000..e69de29 diff --git a/add-and-search-word-data-structure-design/Solution.java b/add-and-search-word-data-structure-design/Solution.java new file mode 100644 index 0000000..51dda42 --- /dev/null +++ b/add-and-search-word-data-structure-design/Solution.java @@ -0,0 +1,82 @@ +public class WordDictionary { + + static class TrieNode { + // Initialize your data structure here. + + TrieNode[] children = new TrieNode[26]; + + int count = 0; + + public TrieNode() { + + } + + TrieNode safe(int i){ + if(children[i] == null){ + children[i] = new TrieNode(); + } + + return children[i]; + } + + int index(char c){ + return (int)(c - 'a'); + } + + void insert(char[] word, int st, int len){ + if(len == 0){ + this.count++; + return; + } + + TrieNode t = safe(index(word[st])); + + t.insert(word, st + 1, len - 1); + } + + boolean search(char[] word, int st, int len){ + if(len == 0){ + return this.count > 0; + } + + if(word[st] == '.'){ + + for(TrieNode t : children){ + if(t != null){ + if(t.search(word, st + 1, len - 1)){ + return true; + } + } + } + + return false; + } + + TrieNode t = children[index(word[st])]; + + if(t == null){ + return false; + } + + return t.search(word, st + 1, len - 1); + } + } + + TrieNode root = new TrieNode(); + + // Adds a word into the data structure. + public void addWord(String word) { + root.insert(word.toCharArray(), 0, word.length()); + } + + // Returns if the word is in the data structure. A word could + // contain the dot character '.' to represent any one letter. + public boolean search(String word) { + return root.search(word.toCharArray(), 0, word.length()); + } +} + +// Your WordDictionary object will be instantiated and called as such: +// WordDictionary wordDictionary = new WordDictionary(); +// wordDictionary.addWord("word"); +// wordDictionary.search("pattern"); diff --git a/add-and-search-word-data-structure-design/WordDictionary.java b/add-and-search-word-data-structure-design/WordDictionary.java new file mode 120000 index 0000000..e570129 --- /dev/null +++ b/add-and-search-word-data-structure-design/WordDictionary.java @@ -0,0 +1 @@ +Solution.java \ No newline at end of file diff --git a/add-and-search-word-data-structure-design/index.md b/add-and-search-word-data-structure-design/index.md new file mode 100644 index 0000000..2cd5b99 --- /dev/null +++ b/add-and-search-word-data-structure-design/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Add and Search Word - Data structure design +date: 2015-05-18 22:25:43+08:00 +leetcode_id: 211 +--- +{% include_relative README.md %} diff --git a/add-binary/index.md b/add-binary/index.md index 1739a6a..c55f9da 100644 --- a/add-binary/index.md +++ b/add-binary/index.md @@ -4,6 +4,4 @@ title: Add Binary date: 2014-12-29 00:26:24 +0800 leetcode_id: 67 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/add-digits/README.md b/add-digits/README.md new file mode 100644 index 0000000..e69de29 diff --git a/add-digits/Solution.java b/add-digits/Solution.java new file mode 100644 index 0000000..ef36b1f --- /dev/null +++ b/add-digits/Solution.java @@ -0,0 +1,5 @@ +public class Solution { + public int addDigits(int num) { + return num - (num - 1) / 9 * 9; + } +} diff --git a/add-digits/index.md b/add-digits/index.md new file mode 100644 index 0000000..0842b3f --- /dev/null +++ b/add-digits/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Add Digits +date: 2015-08-17 00:35:59+08:00 +leetcode_id: 258 +--- +{% include_relative README.md %} diff --git a/add-two-numbers/index.md b/add-two-numbers/index.md index 1c974fd..e1cd9d7 100644 --- a/add-two-numbers/index.md +++ b/add-two-numbers/index.md @@ -4,6 +4,4 @@ title: Add Two Numbers date: 2014-12-29 00:26:24 +0800 leetcode_id: 2 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/anagrams/index.md b/anagrams/index.md index bd03345..2dea82f 100644 --- a/anagrams/index.md +++ b/anagrams/index.md @@ -4,6 +4,4 @@ title: Anagrams date: 2015-01-18 23:39:27 +0800 leetcode_id: 49 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/balanced-binary-tree/index.md b/balanced-binary-tree/index.md index 3ad8f6a..6661ffd 100644 --- a/balanced-binary-tree/index.md +++ b/balanced-binary-tree/index.md @@ -4,6 +4,4 @@ title: Balanced Binary Tree date: 2014-12-29 00:26:24 +0800 leetcode_id: 110 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/basic-calculator-ii/README.md b/basic-calculator-ii/README.md new file mode 100644 index 0000000..e69de29 diff --git a/basic-calculator-ii/Solution.java b/basic-calculator-ii/Solution.java new file mode 100644 index 0000000..9976235 --- /dev/null +++ b/basic-calculator-ii/Solution.java @@ -0,0 +1,183 @@ +public class Solution { + enum TokenType { DIGIT, OP } + + static class Token { + TokenType type; + int val; + + public Token(int val, TokenType type) { + this.val = val; + this.type = type; + } + } + + static final Token EOL = new Token(0, TokenType.OP); + + static final Token[] TOKENS = new Token[256]; + + static { + TOKENS['+'] = new Token('+', TokenType.OP); + TOKENS['-'] = new Token('-', TokenType.OP); + TOKENS['*'] = new Token('*', TokenType.OP); + TOKENS['/'] = new Token('/', TokenType.OP); + TOKENS['('] = new Token('(', TokenType.OP); + TOKENS[')'] = new Token(')', TokenType.OP); + } + + static class Tokenizer { + + Scanner scanner; + + Tokenizer(String s){ + scanner = new Scanner(s); + scanner.useDelimiter(""); + } + + Token next(){ + if(!scanner.hasNext()){ + return EOL; + } + + boolean num = false; + int buf = 0; + while (scanner.hasNextInt()){ + num = true; + buf = buf * 10 + scanner.nextInt(); + } + + if(num){ + return new Token(buf, TokenType.DIGIT); + } + + char c = scanner.next().charAt(0); + + if(TOKENS[c] != null){ + return TOKENS[c]; + } + + return next(); + } + } + + static class RPNCalculator { + LinkedList stack = new LinkedList<>(); + + void addToken(Token t){ + if(t.type == TokenType.OP){ + + int v2 = stack.pop(); + int v1 = stack.pop(); + + switch (t.val){ + case '+': + stack.push(v1 + v2); + break; + case '-': + stack.push(v1 - v2); + break; + case '*': + stack.push(v1 * v2); + break; + case '/': + stack.push(v1 / v2); + break; + default: + // cant happen + } + + } else { // DIGIT + stack.push(t.val); + } + } + + int val(){ + return stack.peek(); + } + } + + public int calculate(String s) { + + RPNCalculator calculator = new RPNCalculator(); + + Tokenizer tokenizer = new Tokenizer(s); + + LinkedList op = new LinkedList<>(); + + Token t; + + next: + while ((t = tokenizer.next()) != EOL){ + + // convert to RPN + + if(t.type == TokenType.DIGIT){ + calculator.addToken(t); + + } else { // type == OP + + retry: + while(true) { + + if(op.isEmpty()){ + op.push(t); + continue next; + } + + Token top = op.peek(); + + switch (t.val) { + case '(': + op.push(t); + break; + + case '+': + case '-': + if (top.val == '+' || top.val == '-' || + top.val == '*' || top.val == '/') { + + calculator.addToken(op.pop()); + continue retry; + } + + op.push(t); + + break; + + case '*': + case '/': + if (top.val == '*' || top.val == '/') { + calculator.addToken(op.pop()); + continue retry; + } + + op.push(t); + + break; + + case ')': + + while (!op.isEmpty()) { + top = op.pop(); + + if (top.val == '(') continue next; + + calculator.addToken(top); + } + + default: + // cant happen + } + + continue next; + } + } + } + + while (!op.isEmpty()){ + calculator.addToken(op.pop()); + } + + return calculator.val(); + } + +} diff --git a/basic-calculator-ii/index.md b/basic-calculator-ii/index.md new file mode 100644 index 0000000..78f146e --- /dev/null +++ b/basic-calculator-ii/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Basic Calculator II +date: 2015-06-29 00:20:12+08:00 +leetcode_id: 227 +--- +{% include_relative README.md %} diff --git a/basic-calculator/README.md b/basic-calculator/README.md new file mode 100644 index 0000000..e69de29 diff --git a/basic-calculator/Solution.java b/basic-calculator/Solution.java new file mode 100644 index 0000000..9976235 --- /dev/null +++ b/basic-calculator/Solution.java @@ -0,0 +1,183 @@ +public class Solution { + enum TokenType { DIGIT, OP } + + static class Token { + TokenType type; + int val; + + public Token(int val, TokenType type) { + this.val = val; + this.type = type; + } + } + + static final Token EOL = new Token(0, TokenType.OP); + + static final Token[] TOKENS = new Token[256]; + + static { + TOKENS['+'] = new Token('+', TokenType.OP); + TOKENS['-'] = new Token('-', TokenType.OP); + TOKENS['*'] = new Token('*', TokenType.OP); + TOKENS['/'] = new Token('/', TokenType.OP); + TOKENS['('] = new Token('(', TokenType.OP); + TOKENS[')'] = new Token(')', TokenType.OP); + } + + static class Tokenizer { + + Scanner scanner; + + Tokenizer(String s){ + scanner = new Scanner(s); + scanner.useDelimiter(""); + } + + Token next(){ + if(!scanner.hasNext()){ + return EOL; + } + + boolean num = false; + int buf = 0; + while (scanner.hasNextInt()){ + num = true; + buf = buf * 10 + scanner.nextInt(); + } + + if(num){ + return new Token(buf, TokenType.DIGIT); + } + + char c = scanner.next().charAt(0); + + if(TOKENS[c] != null){ + return TOKENS[c]; + } + + return next(); + } + } + + static class RPNCalculator { + LinkedList stack = new LinkedList<>(); + + void addToken(Token t){ + if(t.type == TokenType.OP){ + + int v2 = stack.pop(); + int v1 = stack.pop(); + + switch (t.val){ + case '+': + stack.push(v1 + v2); + break; + case '-': + stack.push(v1 - v2); + break; + case '*': + stack.push(v1 * v2); + break; + case '/': + stack.push(v1 / v2); + break; + default: + // cant happen + } + + } else { // DIGIT + stack.push(t.val); + } + } + + int val(){ + return stack.peek(); + } + } + + public int calculate(String s) { + + RPNCalculator calculator = new RPNCalculator(); + + Tokenizer tokenizer = new Tokenizer(s); + + LinkedList op = new LinkedList<>(); + + Token t; + + next: + while ((t = tokenizer.next()) != EOL){ + + // convert to RPN + + if(t.type == TokenType.DIGIT){ + calculator.addToken(t); + + } else { // type == OP + + retry: + while(true) { + + if(op.isEmpty()){ + op.push(t); + continue next; + } + + Token top = op.peek(); + + switch (t.val) { + case '(': + op.push(t); + break; + + case '+': + case '-': + if (top.val == '+' || top.val == '-' || + top.val == '*' || top.val == '/') { + + calculator.addToken(op.pop()); + continue retry; + } + + op.push(t); + + break; + + case '*': + case '/': + if (top.val == '*' || top.val == '/') { + calculator.addToken(op.pop()); + continue retry; + } + + op.push(t); + + break; + + case ')': + + while (!op.isEmpty()) { + top = op.pop(); + + if (top.val == '(') continue next; + + calculator.addToken(top); + } + + default: + // cant happen + } + + continue next; + } + } + } + + while (!op.isEmpty()){ + calculator.addToken(op.pop()); + } + + return calculator.val(); + } + +} diff --git a/basic-calculator/index.md b/basic-calculator/index.md new file mode 100644 index 0000000..3b73b31 --- /dev/null +++ b/basic-calculator/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Basic Calculator +date: 2015-06-29 00:20:02+08:00 +leetcode_id: 224 +--- +{% include_relative README.md %} diff --git a/best-time-to-buy-and-sell-stock-ii/index.md b/best-time-to-buy-and-sell-stock-ii/index.md index f784aca..0b00142 100644 --- a/best-time-to-buy-and-sell-stock-ii/index.md +++ b/best-time-to-buy-and-sell-stock-ii/index.md @@ -4,6 +4,4 @@ title: Best Time to Buy and Sell Stock II date: 2014-12-29 00:26:24 +0800 leetcode_id: 122 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/best-time-to-buy-and-sell-stock-iii/index.md b/best-time-to-buy-and-sell-stock-iii/index.md index 20c985e..e2e62d9 100644 --- a/best-time-to-buy-and-sell-stock-iii/index.md +++ b/best-time-to-buy-and-sell-stock-iii/index.md @@ -4,6 +4,4 @@ title: Best Time to Buy and Sell Stock III date: 2014-12-29 00:26:24 +0800 leetcode_id: 123 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/best-time-to-buy-and-sell-stock-iv/index.md b/best-time-to-buy-and-sell-stock-iv/index.md index 4e1ba22..697d7b5 100644 --- a/best-time-to-buy-and-sell-stock-iv/index.md +++ b/best-time-to-buy-and-sell-stock-iv/index.md @@ -4,6 +4,4 @@ title: Best Time to Buy and Sell Stock IV date: 2015-03-08 01:04:43 +0800 leetcode_id: 188 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/best-time-to-buy-and-sell-stock/index.md b/best-time-to-buy-and-sell-stock/index.md index 1489be2..9e56f38 100644 --- a/best-time-to-buy-and-sell-stock/index.md +++ b/best-time-to-buy-and-sell-stock/index.md @@ -4,6 +4,4 @@ title: Best Time to Buy and Sell Stock date: 2014-12-29 00:26:24 +0800 leetcode_id: 121 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/binary-search-tree-iterator/index.md b/binary-search-tree-iterator/index.md index 228521d..23988ba 100644 --- a/binary-search-tree-iterator/index.md +++ b/binary-search-tree-iterator/index.md @@ -4,6 +4,4 @@ title: Binary Search Tree Iterator date: 2015-01-03 03:26:48 +0800 leetcode_id: 173 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/binary-tree-inorder-traversal/Solution.java b/binary-tree-inorder-traversal/Solution.java index 9a01a4a..43a875a 100644 --- a/binary-tree-inorder-traversal/Solution.java +++ b/binary-tree-inorder-traversal/Solution.java @@ -22,10 +22,10 @@ static class StackState { } } - public ArrayList inorderTraversal(TreeNode root) { - ArrayList rt = new ArrayList(); + public List inorderTraversal(TreeNode root) { + ArrayList rt = new ArrayList<>(); - Deque stack = new LinkedList(); + Deque stack = new LinkedList<>(); if(root != null) stack.push(new StackState(root)); diff --git a/binary-tree-inorder-traversal/index.md b/binary-tree-inorder-traversal/index.md index db33f61..7e71490 100644 --- a/binary-tree-inorder-traversal/index.md +++ b/binary-tree-inorder-traversal/index.md @@ -1,9 +1,7 @@ --- layout: solution title: Binary Tree Inorder Traversal -date: 2014-12-29 00:26:24 +0800 +date: 2015-05-10 01:53:43 +0800 leetcode_id: 94 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/binary-tree-level-order-traversal-ii/index.md b/binary-tree-level-order-traversal-ii/index.md index fe6ac33..8621a95 100644 --- a/binary-tree-level-order-traversal-ii/index.md +++ b/binary-tree-level-order-traversal-ii/index.md @@ -4,6 +4,4 @@ title: Binary Tree Level Order Traversal II date: 2014-12-29 00:26:24 +0800 leetcode_id: 107 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/binary-tree-level-order-traversal/index.md b/binary-tree-level-order-traversal/index.md index ad1f022..32e1904 100644 --- a/binary-tree-level-order-traversal/index.md +++ b/binary-tree-level-order-traversal/index.md @@ -4,6 +4,4 @@ title: Binary Tree Level Order Traversal date: 2014-12-29 00:26:24 +0800 leetcode_id: 102 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/binary-tree-maximum-path-sum/index.md b/binary-tree-maximum-path-sum/index.md index bc62599..128f0d3 100644 --- a/binary-tree-maximum-path-sum/index.md +++ b/binary-tree-maximum-path-sum/index.md @@ -4,6 +4,4 @@ title: Binary Tree Maximum Path Sum date: 2014-12-29 00:26:24 +0800 leetcode_id: 124 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/binary-tree-paths/README.md b/binary-tree-paths/README.md new file mode 100644 index 0000000..e69de29 diff --git a/binary-tree-paths/Solution.java b/binary-tree-paths/Solution.java new file mode 100644 index 0000000..7cbeaa5 --- /dev/null +++ b/binary-tree-paths/Solution.java @@ -0,0 +1,38 @@ +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode(int x) { val = x; } + * } + */ +public class Solution { + + List merge(int v, List subPath){ + return subPath.stream() + .map(p -> v + "->" + p) + .collect(Collectors.toList()); + } + + public List binaryTreePaths(TreeNode root) { + List path = new ArrayList<>(); + + if(root == null) return path; + + if(root.left == null && root.right == null) { + // leaf + return Arrays.asList("" + root.val); + } + + if(root.left != null){ + path.addAll(merge(root.val, binaryTreePaths(root.left))); + } + + if(root.right != null) { + path.addAll(merge(root.val, binaryTreePaths(root.right))); + } + + return path; + } +} diff --git a/binary-tree-paths/index.md b/binary-tree-paths/index.md new file mode 100644 index 0000000..d6d8bae --- /dev/null +++ b/binary-tree-paths/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Binary Tree Paths +date: 2015-08-16 23:34:16+08:00 +leetcode_id: 257 +--- +{% include_relative README.md %} diff --git a/binary-tree-postorder-traversal/Solution.java b/binary-tree-postorder-traversal/Solution.java index 989a06e..d91e9f6 100644 --- a/binary-tree-postorder-traversal/Solution.java +++ b/binary-tree-postorder-traversal/Solution.java @@ -22,10 +22,10 @@ static class StackState { } } - public ArrayList postorderTraversal(TreeNode root) { - ArrayList rt = new ArrayList(); + public List postorderTraversal(TreeNode root) { + ArrayList rt = new ArrayList<>(); - Deque stack = new LinkedList(); + Deque stack = new LinkedList<>(); if(root != null) stack.push(new StackState(root)); diff --git a/binary-tree-postorder-traversal/index.md b/binary-tree-postorder-traversal/index.md index fb76b55..5029919 100644 --- a/binary-tree-postorder-traversal/index.md +++ b/binary-tree-postorder-traversal/index.md @@ -1,9 +1,7 @@ --- layout: solution title: Binary Tree Postorder Traversal -date: 2014-12-29 00:26:24 +0800 +date: 2015-05-11 00:07:43 +0800 leetcode_id: 145 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/binary-tree-preorder-traversal/Solution.java b/binary-tree-preorder-traversal/Solution.java index 6172150..80f812d 100644 --- a/binary-tree-preorder-traversal/Solution.java +++ b/binary-tree-preorder-traversal/Solution.java @@ -22,11 +22,11 @@ static class StackState { } } - public ArrayList preorderTraversal(TreeNode root) { + public List preorderTraversal(TreeNode root) { - ArrayList rt = new ArrayList(); + ArrayList rt = new ArrayList<>(); - Deque stack = new LinkedList(); + Deque stack = new LinkedList<>(); if(root != null) stack.push(new StackState(root)); diff --git a/binary-tree-preorder-traversal/index.md b/binary-tree-preorder-traversal/index.md index e7e8dc4..1e894dc 100644 --- a/binary-tree-preorder-traversal/index.md +++ b/binary-tree-preorder-traversal/index.md @@ -1,9 +1,7 @@ --- layout: solution title: Binary Tree Preorder Traversal -date: 2014-12-29 00:26:24 +0800 +date: 2015-05-11 00:06:56 +0800 leetcode_id: 144 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/binary-tree-right-side-view/index.md b/binary-tree-right-side-view/index.md index 3d08d66..e4990cd 100644 --- a/binary-tree-right-side-view/index.md +++ b/binary-tree-right-side-view/index.md @@ -1,9 +1,7 @@ --- layout: solution title: Binary Tree Right Side View -date: 2015-04-03 21:32:41 +0800 +date: 2015-04-03 21:37:44 +0800 leetcode_id: 199 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/binary-tree-upside-down/Solution.java b/binary-tree-upside-down/Solution.java index 8632e7b..5a88db9 100644 --- a/binary-tree-upside-down/Solution.java +++ b/binary-tree-upside-down/Solution.java @@ -8,9 +8,9 @@ * } */ public class Solution { - - LinkedList queue = new LinkedList(); - + + LinkedList queue = new LinkedList<>(); + void inOrder(TreeNode root){ if(root == null) return; @@ -24,25 +24,26 @@ void inOrder(TreeNode root){ } + // bad side effect root.left = null; root.right = null; } - - public TreeNode UpsideDownBinaryTree(TreeNode root) { - + + public TreeNode upsideDownBinaryTree(TreeNode root) { + inOrder(root); - + TreeNode newRoot = queue.poll(); - + root = newRoot; - + while(!queue.isEmpty()){ root.right = queue.poll(); root.left = queue.poll(); root = root.right; } - + return newRoot; } } diff --git a/binary-tree-upside-down/index.md b/binary-tree-upside-down/index.md index 0e28334..5ca357f 100644 --- a/binary-tree-upside-down/index.md +++ b/binary-tree-upside-down/index.md @@ -1,9 +1,7 @@ --- layout: solution title: Binary Tree Upside Down -date: 2014-11-18 01:45:13 +0800 +date: 2015-05-11 00:19:55 +0800 leetcode_id: 156 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/binary-tree-zigzag-level-order-traversal/index.md b/binary-tree-zigzag-level-order-traversal/index.md index 5fc8762..b310481 100644 --- a/binary-tree-zigzag-level-order-traversal/index.md +++ b/binary-tree-zigzag-level-order-traversal/index.md @@ -4,6 +4,4 @@ title: Binary Tree Zigzag Level Order Traversal date: 2014-12-29 00:26:24 +0800 leetcode_id: 103 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/bitwise-and-of-numbers-range/README.md b/bitwise-and-of-numbers-range/README.md new file mode 100644 index 0000000..e69de29 diff --git a/bitwise-and-of-numbers-range/Solution.java b/bitwise-and-of-numbers-range/Solution.java new file mode 100644 index 0000000..db32634 --- /dev/null +++ b/bitwise-and-of-numbers-range/Solution.java @@ -0,0 +1,26 @@ +public class Solution { + + static final int SIZE = Integer.SIZE; + + static final long[] POW = new long[SIZE + 1]; + + static { + for(int i = 0; i < SIZE; i++){ + POW[i] = (long)Math.pow(2, i); + } + } + + public int rangeBitwiseAnd(int m, int n) { + + for(int i = SIZE; i > 0; i--){ + if(POW[i - 1] <= m && m < POW[i]){ + if(POW[i - 1] <= n && n < POW[i]){ + long p = POW[i - 1]; + return (int)p | rangeBitwiseAnd((int)(m & (p - 1)), (int)(n & (p - 1))); + } + } + } + + return 0; + } +} diff --git a/bitwise-and-of-numbers-range/index.md b/bitwise-and-of-numbers-range/index.md new file mode 100644 index 0000000..03138a9 --- /dev/null +++ b/bitwise-and-of-numbers-range/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Bitwise AND of Numbers Range +date: 2015-05-11 01:12:33 +0800 +leetcode_id: 201 +--- +{% include_relative README.md %} diff --git a/candy/index.md b/candy/index.md index b78c5d6..997e539 100644 --- a/candy/index.md +++ b/candy/index.md @@ -4,6 +4,4 @@ title: Candy date: 2014-12-29 00:26:24 +0800 leetcode_id: 135 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/climbing-stairs/index.md b/climbing-stairs/index.md index d6a084e..30af6b4 100644 --- a/climbing-stairs/index.md +++ b/climbing-stairs/index.md @@ -4,6 +4,4 @@ title: Climbing Stairs date: 2014-12-29 00:26:24 +0800 leetcode_id: 70 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/clone-graph/index.md b/clone-graph/index.md index f98f6fe..07acdaf 100644 --- a/clone-graph/index.md +++ b/clone-graph/index.md @@ -4,6 +4,4 @@ title: Clone Graph date: 2014-12-29 00:26:24 +0800 leetcode_id: 133 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/closest-binary-search-tree-value/README.md b/closest-binary-search-tree-value/README.md new file mode 100644 index 0000000..e69de29 diff --git a/closest-binary-search-tree-value/Solution.java b/closest-binary-search-tree-value/Solution.java new file mode 100644 index 0000000..4408944 --- /dev/null +++ b/closest-binary-search-tree-value/Solution.java @@ -0,0 +1,34 @@ +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode(int x) { val = x; } + * } + */ +public class Solution { + + int closestValue(int v1, int v2, double target){ + double _v1 = Math.abs(target - v1); + double _v2 = Math.abs(target - v2); + + if(_v1 < _v2) return v1; + else return v2; + } + + public int closestValue(TreeNode root, double target) { + + int closest = root.val; + + if(root.left != null){ + closest = closestValue(closestValue(root.left, target), closest, target); + } + + if(root.right != null){ + closest = closestValue(closestValue(root.right, target), closest, target); + } + + return closest; + } +} diff --git a/closest-binary-search-tree-value/index.md b/closest-binary-search-tree-value/index.md new file mode 100644 index 0000000..d5e7a94 --- /dev/null +++ b/closest-binary-search-tree-value/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Closest Binary Search Tree Value +date: 2015-08-28 14:52:37+08:00 +leetcode_id: 270 +--- +{% include_relative README.md %} diff --git a/combination-sum-ii/index.md b/combination-sum-ii/index.md index 5e1d25e..7f71dce 100644 --- a/combination-sum-ii/index.md +++ b/combination-sum-ii/index.md @@ -4,6 +4,4 @@ title: Combination Sum II date: 2014-12-29 00:26:24 +0800 leetcode_id: 40 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/combination-sum-iii/README.md b/combination-sum-iii/README.md new file mode 100644 index 0000000..e69de29 diff --git a/combination-sum-iii/Solution.java b/combination-sum-iii/Solution.java new file mode 100644 index 0000000..e855819 --- /dev/null +++ b/combination-sum-iii/Solution.java @@ -0,0 +1,41 @@ +public class Solution { + + Integer[] stack; + List> found; + + void search(int p, int k, int current, int n, int st){ + + if(p == k){ + if(n == current){ + found.add(new ArrayList<>(Arrays.asList(stack))); + } + + return; + } + + // cut + if(current + 9 * (k - p) < n){ + return; + } + + if(current + 1 * (k - p) > n){ + return; + } + + for(int i = st; i < 10; i++){ + if(current + i <= n){ + stack[p] = i; + search(p + 1, k, current + i, n, i + 1); + } + } + } + + public List> combinationSum3(int k, int n) { + found = new ArrayList<>(); + stack = new Integer[k]; + + search(0, k, 0, n, 1); + + return found; + } +} diff --git a/combination-sum-iii/index.md b/combination-sum-iii/index.md new file mode 100644 index 0000000..fc4f38e --- /dev/null +++ b/combination-sum-iii/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Combination Sum III +date: 2015-05-26 02:05:29+08:00 +leetcode_id: 216 +--- +{% include_relative README.md %} diff --git a/combination-sum/index.md b/combination-sum/index.md index 7f3a9ae..53421c6 100644 --- a/combination-sum/index.md +++ b/combination-sum/index.md @@ -4,6 +4,4 @@ title: Combination Sum date: 2014-12-29 00:26:24 +0800 leetcode_id: 39 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/combinations/index.md b/combinations/index.md index 175a482..d46668c 100644 --- a/combinations/index.md +++ b/combinations/index.md @@ -4,6 +4,4 @@ title: Combinations date: 2014-12-29 00:26:24 +0800 leetcode_id: 77 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/compare-version-numbers/index.md b/compare-version-numbers/index.md index 0273b92..7151bae 100644 --- a/compare-version-numbers/index.md +++ b/compare-version-numbers/index.md @@ -4,6 +4,4 @@ title: Compare Version Numbers date: 2015-01-21 17:26:33 +0800 leetcode_id: 165 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/construct-binary-tree-from-inorder-and-postorder-traversal/index.md b/construct-binary-tree-from-inorder-and-postorder-traversal/index.md index 7247604..6497884 100644 --- a/construct-binary-tree-from-inorder-and-postorder-traversal/index.md +++ b/construct-binary-tree-from-inorder-and-postorder-traversal/index.md @@ -4,6 +4,4 @@ title: Construct Binary Tree from Inorder and Postorder Traversal date: 2014-12-29 00:26:24 +0800 leetcode_id: 106 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/construct-binary-tree-from-preorder-and-inorder-traversal/index.md b/construct-binary-tree-from-preorder-and-inorder-traversal/index.md index d7037b3..b2274d2 100644 --- a/construct-binary-tree-from-preorder-and-inorder-traversal/index.md +++ b/construct-binary-tree-from-preorder-and-inorder-traversal/index.md @@ -4,6 +4,4 @@ title: Construct Binary Tree from Preorder and Inorder Traversal date: 2014-12-29 00:26:24 +0800 leetcode_id: 105 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/container-with-most-water/index.md b/container-with-most-water/index.md index 06de669..b1e611a 100644 --- a/container-with-most-water/index.md +++ b/container-with-most-water/index.md @@ -4,6 +4,4 @@ title: Container With Most Water date: 2014-12-29 00:26:24 +0800 leetcode_id: 11 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/contains-duplicate-ii/README.md b/contains-duplicate-ii/README.md new file mode 100644 index 0000000..e69de29 diff --git a/contains-duplicate-ii/Solution.java b/contains-duplicate-ii/Solution.java new file mode 100644 index 0000000..00a613a --- /dev/null +++ b/contains-duplicate-ii/Solution.java @@ -0,0 +1,27 @@ +public class Solution { + public boolean containsNearbyDuplicate(int[] nums, int k) { + + if(k <= 0) return false; + + Map> pairs = new HashMap<>(); + + for(int i = 0; i < nums.length; i++){ + List l = pairs.get(nums[i]); + + if(l == null){ + l = new ArrayList<>(); + pairs.put(nums[i], l); + } else { + for(int j : l){ + if(i - j <= k){ + return true; + } + } + } + + l.add(i); + } + + return false; + } +} diff --git a/contains-duplicate-ii/index.md b/contains-duplicate-ii/index.md new file mode 100644 index 0000000..0abfdd1 --- /dev/null +++ b/contains-duplicate-ii/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Contains Duplicate II +date: 2015-05-29 11:55:22+08:00 +leetcode_id: 219 +--- +{% include_relative README.md %} diff --git a/contains-duplicate-iii/README.md b/contains-duplicate-iii/README.md new file mode 100644 index 0000000..e69de29 diff --git a/contains-duplicate-iii/Solution.java b/contains-duplicate-iii/Solution.java new file mode 100644 index 0000000..548af82 --- /dev/null +++ b/contains-duplicate-iii/Solution.java @@ -0,0 +1,80 @@ +public class Solution { + + static class Tree { + TreeMap tree = new TreeMap<>(); + + int size = 0; + + void add(Integer n){ + Integer v = tree.get(n); + + if(v == null){ + v = 0; + } + + tree.put(n, v + 1); + + size++; + } + + void remove(Integer n){ + Integer v = tree.get(n); + + v--; + + if(v == 0){ + tree.remove(n); + } else { + tree.put(n, v); + } + + size--; + } + + // fuck overflow + long nearSub(Integer n){ + + Integer v = tree.get(n); + if(v >= 2) return 0; + + long min = Long.MAX_VALUE; + + Integer h = tree.higherKey(n); + if(h != null){ + min = h - n; + } + + Integer l = tree.lowerKey(n); + if(l != null){ + min = Math.min(min, (long)n - l); + } + + return min; + } + } + + public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) { + if (k <= 0) return false; + if (nums.length <= 1) return false; + + Tree tree = new Tree(); + + tree.add(nums[0]); + + int p = 0; + for(int i = 1; i < nums.length; i++){ + + tree.add(nums[i]); + + if(tree.nearSub(nums[i]) <= t){ + return true; + } + + if(tree.size > k){ + tree.remove(nums[p++]); + } + } + + return false; + } +} diff --git a/contains-duplicate-iii/index.md b/contains-duplicate-iii/index.md new file mode 100644 index 0000000..a2aed57 --- /dev/null +++ b/contains-duplicate-iii/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Contains Duplicate III +date: 2015-06-02 01:36:35+08:00 +leetcode_id: 220 +--- +{% include_relative README.md %} diff --git a/contains-duplicate/README.md b/contains-duplicate/README.md new file mode 100644 index 0000000..e69de29 diff --git a/contains-duplicate/Solution.java b/contains-duplicate/Solution.java new file mode 100644 index 0000000..8a51256 --- /dev/null +++ b/contains-duplicate/Solution.java @@ -0,0 +1,15 @@ +public class Solution { + public boolean containsDuplicate(int[] nums) { + Set s = new HashSet<>(); + + for(int n : nums){ + if(s.contains(n)){ + return true; + } + + s.add(n); + } + + return false; + } +} diff --git a/contains-duplicate/index.md b/contains-duplicate/index.md new file mode 100644 index 0000000..f38ae53 --- /dev/null +++ b/contains-duplicate/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Contains Duplicate +date: 2015-05-25 19:40:06+08:00 +leetcode_id: 217 +--- +{% include_relative README.md %} diff --git a/convert-sorted-array-to-binary-search-tree/index.md b/convert-sorted-array-to-binary-search-tree/index.md index e6dee32..c904583 100644 --- a/convert-sorted-array-to-binary-search-tree/index.md +++ b/convert-sorted-array-to-binary-search-tree/index.md @@ -4,6 +4,4 @@ title: Convert Sorted Array to Binary Search Tree date: 2014-12-29 00:26:24 +0800 leetcode_id: 108 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/convert-sorted-list-to-binary-search-tree/index.md b/convert-sorted-list-to-binary-search-tree/index.md index dd62fa9..cd4386e 100644 --- a/convert-sorted-list-to-binary-search-tree/index.md +++ b/convert-sorted-list-to-binary-search-tree/index.md @@ -4,6 +4,4 @@ title: Convert Sorted List to Binary Search Tree date: 2014-12-29 00:26:24 +0800 leetcode_id: 109 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/copy-list-with-random-pointer/index.md b/copy-list-with-random-pointer/index.md index 78f85e1..f88396b 100644 --- a/copy-list-with-random-pointer/index.md +++ b/copy-list-with-random-pointer/index.md @@ -4,6 +4,4 @@ title: Copy List with Random Pointer date: 2014-12-29 00:26:24 +0800 leetcode_id: 138 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/count-and-say/index.md b/count-and-say/index.md index 555c64e..79806a3 100644 --- a/count-and-say/index.md +++ b/count-and-say/index.md @@ -4,6 +4,4 @@ title: Count and Say date: 2014-12-29 00:26:24 +0800 leetcode_id: 38 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/count-complete-tree-nodes/README.md b/count-complete-tree-nodes/README.md new file mode 100644 index 0000000..e69de29 diff --git a/count-complete-tree-nodes/Solution.java b/count-complete-tree-nodes/Solution.java new file mode 100644 index 0000000..2f9feb6 --- /dev/null +++ b/count-complete-tree-nodes/Solution.java @@ -0,0 +1,70 @@ +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode(int x) { val = x; } + * } + */ +public class Solution { + + int height(TreeNode root){ + if(root == null) return 0; + + return 1 + height(root.left); + } + + + int leaves = 0; + boolean stop = false; + + void countLeaves(TreeNode root, int heightToLeaf){ + + if(root == null) return; + + if(stop) return; + + if(heightToLeaf == 2) { + + if(root.right != null){ + leaves += 2; + } else { + + // at lease one is null + stop = true; + + if(root.left != null) { + leaves += 1; + } + } + + + return; + } + + countLeaves(root.left, heightToLeaf - 1); + countLeaves(root.right, heightToLeaf - 1); + } + + int perfectTreeNodeCount(int height){ + if(height == 0) return 0; + if(height == 1) return 1; + + return (int)Math.pow(2, height) - 1; + } + + public int countNodes(TreeNode root) { + + int h = height(root); + + countLeaves(root, h); + + if(!stop){ + // perfect tree + return perfectTreeNodeCount(h); + } + + return perfectTreeNodeCount(h - 1) + leaves; + } +} diff --git a/count-complete-tree-nodes/index.md b/count-complete-tree-nodes/index.md new file mode 100644 index 0000000..d19bd9f --- /dev/null +++ b/count-complete-tree-nodes/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Count Complete Tree Nodes +date: 2015-06-08 00:30:07+08:00 +leetcode_id: 222 +--- +{% include_relative README.md %} diff --git a/count-primes/README.md b/count-primes/README.md new file mode 100644 index 0000000..e69de29 diff --git a/count-primes/Solution.java b/count-primes/Solution.java new file mode 100644 index 0000000..13c7394 --- /dev/null +++ b/count-primes/Solution.java @@ -0,0 +1,21 @@ +public class Solution { + public int countPrimes(int n) { + + if(n < 2) return 0; + + BitSet b = new BitSet(); + + b.set(0); + b.set(1); + + for(int p = 2; p * 2 < n ; p = b.nextClearBit(p + 1)){ + for(int i = 2; p * i < n ;i++){ + b.set(p * i); + } + } + + b.flip(0, n); + + return b.cardinality(); + } +} diff --git a/count-primes/index.md b/count-primes/index.md new file mode 100644 index 0000000..4e43bb4 --- /dev/null +++ b/count-primes/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Count Primes +date: 2015-04-27 16:40:41 +0800 +leetcode_id: 204 +--- +{% include_relative README.md %} diff --git a/count-univalue-subtrees/README.md b/count-univalue-subtrees/README.md new file mode 100644 index 0000000..e69de29 diff --git a/count-univalue-subtrees/Solution.java b/count-univalue-subtrees/Solution.java new file mode 100644 index 0000000..53c86e4 --- /dev/null +++ b/count-univalue-subtrees/Solution.java @@ -0,0 +1,39 @@ +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode(int x) { val = x; } + * } + */ +public class Solution { + + void patch(Integer[] v, TreeNode parent, TreeNode me){ + if(me == null){ + v[1] = parent.val; + } + } + + // [count, uniq val] + Integer[] _countUnivalSubtrees(TreeNode root) { + + if(root == null) return new Integer[]{0, null}; + + Integer[] left = _countUnivalSubtrees(root.left); + patch(left, root, root.left); + + Integer[] right = _countUnivalSubtrees(root.right); + patch(right, root, root.right); + + if(Objects.equals(left[1], root.val) && Objects.equals(right[1], root.val)){ + return new Integer[]{left[0] + right[0] + 1, root.val}; + } + + return new Integer[]{left[0] + right[0], null}; + } + + public int countUnivalSubtrees(TreeNode root) { + return _countUnivalSubtrees(root)[0]; + } +} diff --git a/count-univalue-subtrees/index.md b/count-univalue-subtrees/index.md new file mode 100644 index 0000000..be868a9 --- /dev/null +++ b/count-univalue-subtrees/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Count Univalue Subtrees +date: 2015-08-06 22:25:20+08:00 +leetcode_id: 250 +--- +{% include_relative README.md %} diff --git a/course-schedule-ii/README.md b/course-schedule-ii/README.md new file mode 100644 index 0000000..e69de29 diff --git a/course-schedule-ii/Solution.java b/course-schedule-ii/Solution.java new file mode 100644 index 0000000..895f837 --- /dev/null +++ b/course-schedule-ii/Solution.java @@ -0,0 +1,69 @@ +public class Solution { + + static class Vertex { + + int id; + + Vertex(int id){ + this.id = id; + } + + Set in = new HashSet<>(); + Set out = new HashSet<>(); + + boolean isSink(){ + return out.isEmpty(); + } + } + + Vertex safe(Vertex[] G, int id){ + if(G[id] == null){ + G[id] = new Vertex(id); + } + + return G[id]; + } + + public int[] findOrder(int numCourses, int[][] prerequisites) { + Vertex[] G = new Vertex[numCourses]; + + for(int[] p : prerequisites){ + safe(G, p[0]).out.add(p[1]); + safe(G, p[1]).in.add(p[0]); + } + + Set S = Arrays.stream(G) + .filter(v -> v != null) + .collect(Collectors.toSet()); + + + LinkedHashSet order = new LinkedHashSet<>(numCourses); + + loop: + while(!S.isEmpty()){ + + for(Vertex v : S){ + if(v.isSink()){ + order.add(v.id); + + S.remove(v); + + for(int i : v.in){ + G[i].out.remove(v.id); + } + + continue loop; + } + } + + return new int[]{}; + } + + // fill courses not in G + order.addAll(IntStream.range(0, numCourses).boxed().collect(Collectors.toSet())); + + return order.stream() + .mapToInt(i -> i) + .toArray(); + } +} diff --git a/course-schedule-ii/index.md b/course-schedule-ii/index.md new file mode 100644 index 0000000..cb84cb8 --- /dev/null +++ b/course-schedule-ii/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Course Schedule II +date: 2015-05-14 00:31:26+08:00 +leetcode_id: 210 +--- +{% include_relative README.md %} diff --git a/course-schedule/README.md b/course-schedule/README.md new file mode 100644 index 0000000..e69de29 diff --git a/course-schedule/Solution.java b/course-schedule/Solution.java new file mode 100644 index 0000000..7200c27 --- /dev/null +++ b/course-schedule/Solution.java @@ -0,0 +1,61 @@ +public class Solution { + + static class Vertex { + + int id; + + Vertex(int id){ + this.id = id; + } + + Set in = new HashSet<>(); + Set out = new HashSet<>(); + + boolean isSink(){ + return out.isEmpty(); + } + } + + Vertex safe(Vertex[] G, int id){ + if(G[id] == null){ + G[id] = new Vertex(id); + } + + return G[id]; + } + + public boolean canFinish(int numCourses, int[][] prerequisites) { + + Vertex[] G = new Vertex[numCourses]; + + for(int[] p : prerequisites){ + safe(G, p[0]).out.add(p[1]); + safe(G, p[1]).in.add(p[0]); + } + + Set S = Arrays.stream(G) + .filter(v -> v != null) + .collect(Collectors.toSet()); + + + loop: + while(!S.isEmpty()){ + + for(Vertex v : S){ + if(v.isSink()){ + S.remove(v); + + for(int i : v.in){ + G[i].out.remove(v.id); + } + + continue loop; + } + } + + return false; + } + + return true; + } +} diff --git a/course-schedule/index.md b/course-schedule/index.md new file mode 100644 index 0000000..c5a98c1 --- /dev/null +++ b/course-schedule/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Course Schedule +date: 2015-05-07 00:51:31 +0800 +leetcode_id: 207 +--- +{% include_relative README.md %} diff --git a/decode-ways/index.md b/decode-ways/index.md index 6461d68..7530ef7 100644 --- a/decode-ways/index.md +++ b/decode-ways/index.md @@ -4,6 +4,4 @@ title: Decode Ways date: 2014-12-29 00:26:24 +0800 leetcode_id: 91 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/delete-node-in-a-linked-list/README.md b/delete-node-in-a-linked-list/README.md new file mode 100644 index 0000000..e69de29 diff --git a/delete-node-in-a-linked-list/Solution.java b/delete-node-in-a-linked-list/Solution.java new file mode 100644 index 0000000..9e83a6f --- /dev/null +++ b/delete-node-in-a-linked-list/Solution.java @@ -0,0 +1,14 @@ +/** + * Definition for singly-linked list. + * public class ListNode { + * int val; + * ListNode next; + * ListNode(int x) { val = x; } + * } + */ +public class Solution { + public void deleteNode(ListNode node) { + node.val = node.next.val; + node.next = node.next.next; + } +} diff --git a/delete-node-in-a-linked-list/index.md b/delete-node-in-a-linked-list/index.md new file mode 100644 index 0000000..80f716b --- /dev/null +++ b/delete-node-in-a-linked-list/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Delete Node in a Linked List +date: 2015-07-26 14:42:29+08:00 +leetcode_id: 237 +--- +{% include_relative README.md %} diff --git a/different-ways-to-add-parentheses/README.md b/different-ways-to-add-parentheses/README.md new file mode 100644 index 0000000..e69de29 diff --git a/different-ways-to-add-parentheses/Solution.java b/different-ways-to-add-parentheses/Solution.java new file mode 100644 index 0000000..b1ace31 --- /dev/null +++ b/different-ways-to-add-parentheses/Solution.java @@ -0,0 +1,81 @@ +public class Solution { + + int calc(int l, int r, char op){ + switch(op){ + case '+': + return l + r; + case '-': + return l - r; + case '*': + return l * r; + } + + // unreachable + throw new RuntimeException(); + } + + List merge(Listleft, List right, char op){ + if(left.isEmpty()) return right; + if(right.isEmpty()) return left; + + List rt = new ArrayList<>(); + + for(int l : left){ + for(int r : right){ + rt.add(calc(l, r, op)); + } + } + + return rt; + } + + List diffWaysToCompute(Integer[] nums, int nst, int ned, Character[] ops){ + + List rt = new ArrayList<>(); + + if(nst + 1 == ned){ + rt.add(nums[nst]); + return rt; + } + + for(int i = nst; i < ned - 1; i++){ + char op = ops[i]; + List left = diffWaysToCompute(nums, nst, i + 1, ops); + List right = diffWaysToCompute(nums, i + 1, ned, ops); + + rt.addAll(merge(left, right, op)); + } + + return rt; + } + + public List diffWaysToCompute(String input) { + Scanner scanner = new Scanner(input); + scanner.useDelimiter(""); + + List nums = new ArrayList<>(); + List ops = new ArrayList<>(); + + while(scanner.hasNext()){ + boolean num = false; + int buf = 0; + while (scanner.hasNextInt()){ + num = true; + buf = buf * 10 + scanner.nextInt(); + } + + if(num){ + nums.add(buf); + continue; + } + + Character op = scanner.next().charAt(0); + ops.add(op); + } + + Integer[] _nums = nums.toArray(new Integer[0]); + Character[] _ops = ops.toArray(new Character[0]); + + return diffWaysToCompute(_nums, 0, _nums.length, _ops); + } +} diff --git a/different-ways-to-add-parentheses/index.md b/different-ways-to-add-parentheses/index.md new file mode 100644 index 0000000..e49e354 --- /dev/null +++ b/different-ways-to-add-parentheses/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Different Ways to Add Parentheses +date: 2015-08-06 22:21:28+08:00 +leetcode_id: 241 +--- +{% include_relative README.md %} diff --git a/distinct-subsequences/index.md b/distinct-subsequences/index.md index b1da625..d59963f 100644 --- a/distinct-subsequences/index.md +++ b/distinct-subsequences/index.md @@ -4,6 +4,4 @@ title: Distinct Subsequences date: 2014-12-29 00:26:24 +0800 leetcode_id: 115 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/divide-two-integers/index.md b/divide-two-integers/index.md index c4b00cf..b68a336 100644 --- a/divide-two-integers/index.md +++ b/divide-two-integers/index.md @@ -4,6 +4,4 @@ title: Divide Two Integers date: 2014-12-29 00:26:24 +0800 leetcode_id: 29 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/dungeon-game/index.md b/dungeon-game/index.md index a4fc3bc..07c9818 100644 --- a/dungeon-game/index.md +++ b/dungeon-game/index.md @@ -4,6 +4,4 @@ title: Dungeon Game date: 2015-01-21 18:54:25 +0800 leetcode_id: 174 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/edit-distance/index.md b/edit-distance/index.md index 07ac2b6..d28c003 100644 --- a/edit-distance/index.md +++ b/edit-distance/index.md @@ -4,6 +4,4 @@ title: Edit Distance date: 2014-12-29 00:26:24 +0800 leetcode_id: 72 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/encode-and-decode-strings/Codec.java b/encode-and-decode-strings/Codec.java new file mode 120000 index 0000000..e570129 --- /dev/null +++ b/encode-and-decode-strings/Codec.java @@ -0,0 +1 @@ +Solution.java \ No newline at end of file diff --git a/encode-and-decode-strings/README.md b/encode-and-decode-strings/README.md new file mode 100644 index 0000000..e69de29 diff --git a/encode-and-decode-strings/Solution.java b/encode-and-decode-strings/Solution.java new file mode 100644 index 0000000..ae01953 --- /dev/null +++ b/encode-and-decode-strings/Solution.java @@ -0,0 +1,63 @@ +public class Codec { + + static final int MAX_LEN = Integer.toHexString(Integer.MAX_VALUE).length(); + + // lazy ... should be byte[] + static final String NUM_PATTERN = "%0" + MAX_LEN + "x"; + + String serializeNumber(int n){ + return String.format(NUM_PATTERN, n); + } + + int deserializeNumber(char[] s, int offset){ + return Integer.parseInt(new String(s, offset, MAX_LEN), 16); + } + + /* [count] [str len] [str ...] ... [str len][str ... ] + * 0 L 2L 2L + strlen nL (n + 1)L (n + 1)L + strlen + */ + + // Encodes a list of strings to a single string. + public String encode(List strs) { + StringBuilder sb = new StringBuilder(); + sb.append(serializeNumber(strs.size())); + + for(String s : strs){ + sb.append(serializeNumber(s.length())); + sb.append(s); + } + + return sb.toString(); + } + + // Decodes a single string to a list of strings. + public List decode(String s) { + char[] S = s.toCharArray(); + + int offset = 0; + int n = deserializeNumber(S, offset); + // move to first str len start + offset += MAX_LEN; + + ArrayList strs = new ArrayList<>(n); + + for(int i = 0; i < n; i++){ + + int len = deserializeNumber(S, offset); + + // move to str start + offset += MAX_LEN; + + strs.add(new String(S, offset, len)); + + // move to next str len start + offset += len; + } + + return strs; + } +} + +// Your Codec object will be instantiated and called as such: +// Codec codec = new Codec(); +// codec.decode(codec.encode(strs)); diff --git a/encode-and-decode-strings/index.md b/encode-and-decode-strings/index.md new file mode 100644 index 0000000..ac59955 --- /dev/null +++ b/encode-and-decode-strings/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Encode and Decode Strings +date: 2015-09-03 13:28:10+08:00 +leetcode_id: 271 +--- +{% include_relative README.md %} diff --git a/evaluate-reverse-polish-notation/index.md b/evaluate-reverse-polish-notation/index.md index 664becc..c773d91 100644 --- a/evaluate-reverse-polish-notation/index.md +++ b/evaluate-reverse-polish-notation/index.md @@ -4,6 +4,4 @@ title: Evaluate Reverse Polish Notation date: 2014-12-29 00:26:24 +0800 leetcode_id: 150 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/excel-sheet-column-number/index.md b/excel-sheet-column-number/index.md index 9f7aaed..b325899 100644 --- a/excel-sheet-column-number/index.md +++ b/excel-sheet-column-number/index.md @@ -4,6 +4,4 @@ title: Excel Sheet Column Number date: 2015-01-21 17:54:45 +0800 leetcode_id: 171 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/excel-sheet-column-title/index.md b/excel-sheet-column-title/index.md index 4806a7f..2923fb9 100644 --- a/excel-sheet-column-title/index.md +++ b/excel-sheet-column-title/index.md @@ -4,6 +4,4 @@ title: Excel Sheet Column Title date: 2015-01-21 17:53:50 +0800 leetcode_id: 168 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/factor-combinations/README.md b/factor-combinations/README.md new file mode 100644 index 0000000..e69de29 diff --git a/factor-combinations/Solution.java b/factor-combinations/Solution.java new file mode 100644 index 0000000..05a8d9d --- /dev/null +++ b/factor-combinations/Solution.java @@ -0,0 +1,26 @@ +public class Solution { + List> getFactors(int n, int low, int high) { + List> found = new ArrayList<>(); + + if(low <= n && n < high){ + found.add(Arrays.asList(n)); + } + + for(int i = low; n / i >= low; i++){ + if(n % i == 0){ + for(List sub : getFactors(n / i, i, n)){ + List l = new ArrayList<>(); + l.add(i); + l.addAll(sub); + found.add(l); + } + } + } + + return found; + } + + public List> getFactors(int n) { + return getFactors(n, 2, n); + } +} diff --git a/factor-combinations/index.md b/factor-combinations/index.md new file mode 100644 index 0000000..0d45107 --- /dev/null +++ b/factor-combinations/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Factor Combinations +date: 2015-08-12 23:03:42+08:00 +leetcode_id: 254 +--- +{% include_relative README.md %} diff --git a/factorial-trailing-zeroes/index.md b/factorial-trailing-zeroes/index.md index ea0c193..733104d 100644 --- a/factorial-trailing-zeroes/index.md +++ b/factorial-trailing-zeroes/index.md @@ -4,6 +4,4 @@ title: Factorial Trailing Zeroes date: 2015-01-03 03:36:44 +0800 leetcode_id: 172 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/find-minimum-in-rotated-sorted-array-ii/index.md b/find-minimum-in-rotated-sorted-array-ii/index.md index ac995a8..def2bf9 100644 --- a/find-minimum-in-rotated-sorted-array-ii/index.md +++ b/find-minimum-in-rotated-sorted-array-ii/index.md @@ -4,6 +4,4 @@ title: Find Minimum in Rotated Sorted Array II date: 2014-12-29 00:26:24 +0800 leetcode_id: 154 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/find-minimum-in-rotated-sorted-array/index.md b/find-minimum-in-rotated-sorted-array/index.md index 466d818..255c2f1 100644 --- a/find-minimum-in-rotated-sorted-array/index.md +++ b/find-minimum-in-rotated-sorted-array/index.md @@ -4,6 +4,4 @@ title: Find Minimum in Rotated Sorted Array date: 2014-12-29 00:26:24 +0800 leetcode_id: 153 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/find-peak-element/index.md b/find-peak-element/index.md index a88f70d..693fe39 100644 --- a/find-peak-element/index.md +++ b/find-peak-element/index.md @@ -4,6 +4,4 @@ title: Find Peak Element date: 2014-12-29 00:26:24 +0800 leetcode_id: 162 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/first-bad-version/README.md b/first-bad-version/README.md new file mode 100644 index 0000000..e69de29 diff --git a/first-bad-version/Solution.java b/first-bad-version/Solution.java new file mode 100644 index 0000000..9e0007b --- /dev/null +++ b/first-bad-version/Solution.java @@ -0,0 +1,23 @@ +/* The isBadVersion API is defined in the parent class VersionControl. + boolean isBadVersion(int version); */ + +public class Solution extends VersionControl { + public int firstBadVersion(int n) { + int good = 0; // not exists + int bad = n; + + for(;;) { + + if(bad - good <= 1) return bad; + + int t = (bad - good) / 2 + good; // fuck overflow + + if(isBadVersion(t)){ + bad = t; + } else { + good = t; + } + } + + } +} diff --git a/first-bad-version/index.md b/first-bad-version/index.md new file mode 100644 index 0000000..3620450 --- /dev/null +++ b/first-bad-version/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: First Bad Version +date: 2015-09-24 16:10:45+08:00 +leetcode_id: 278 +--- +{% include_relative README.md %} diff --git a/first-missing-positive/index.md b/first-missing-positive/index.md index 60d7cd5..9ee8208 100644 --- a/first-missing-positive/index.md +++ b/first-missing-positive/index.md @@ -4,6 +4,4 @@ title: First Missing Positive date: 2014-12-29 00:26:24 +0800 leetcode_id: 41 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/flatten-2d-vector/README.md b/flatten-2d-vector/README.md new file mode 100644 index 0000000..e69de29 diff --git a/flatten-2d-vector/Solution.java b/flatten-2d-vector/Solution.java new file mode 100644 index 0000000..9422eeb --- /dev/null +++ b/flatten-2d-vector/Solution.java @@ -0,0 +1,33 @@ +public class Vector2D { + + Iterator> outterIter; + Iterator innerIter = Collections.emptyIterator(); + + public Vector2D(List> vec2d) { + outterIter = vec2d.iterator(); + } + + public int next() { + return innerIter.next(); + } + + public boolean hasNext() { + if(innerIter.hasNext()){ + return true; + } + + if(!outterIter.hasNext()){ + return false; + } + + innerIter = outterIter.next().iterator(); + + return hasNext(); + } +} + +/** + * Your Vector2D object will be instantiated and called as such: + * Vector2D i = new Vector2D(vec2d); + * while (i.hasNext()) v[f()] = i.next(); + */ diff --git a/flatten-2d-vector/Vector2D.java b/flatten-2d-vector/Vector2D.java new file mode 120000 index 0000000..e570129 --- /dev/null +++ b/flatten-2d-vector/Vector2D.java @@ -0,0 +1 @@ +Solution.java \ No newline at end of file diff --git a/flatten-2d-vector/index.md b/flatten-2d-vector/index.md new file mode 100644 index 0000000..e08838a --- /dev/null +++ b/flatten-2d-vector/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Flatten 2D Vector +date: 2015-08-06 22:27:26+08:00 +leetcode_id: 251 +--- +{% include_relative README.md %} diff --git a/flatten-binary-tree-to-linked-list/index.md b/flatten-binary-tree-to-linked-list/index.md index 03c81ec..e9beaf3 100644 --- a/flatten-binary-tree-to-linked-list/index.md +++ b/flatten-binary-tree-to-linked-list/index.md @@ -4,6 +4,4 @@ title: Flatten Binary Tree to Linked List date: 2014-12-29 00:26:24 +0800 leetcode_id: 114 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/fraction-to-recurring-decimal/index.md b/fraction-to-recurring-decimal/index.md index 813fdef..5295755 100644 --- a/fraction-to-recurring-decimal/index.md +++ b/fraction-to-recurring-decimal/index.md @@ -4,6 +4,4 @@ title: Fraction to Recurring Decimal date: 2015-01-21 17:46:10 +0800 leetcode_id: 166 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/gas-station/index.md b/gas-station/index.md index 0f36f94..b053213 100644 --- a/gas-station/index.md +++ b/gas-station/index.md @@ -4,6 +4,4 @@ title: Gas Station date: 2014-12-29 00:26:24 +0800 leetcode_id: 134 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/generate-parentheses/index.md b/generate-parentheses/index.md index 0e86418..6773a80 100644 --- a/generate-parentheses/index.md +++ b/generate-parentheses/index.md @@ -4,6 +4,4 @@ title: Generate Parentheses date: 2014-12-29 00:26:24 +0800 leetcode_id: 22 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/gray-code/index.md b/gray-code/index.md index 25c0864..319da9d 100644 --- a/gray-code/index.md +++ b/gray-code/index.md @@ -4,6 +4,4 @@ title: Gray Code date: 2015-02-13 00:44:38 +0800 leetcode_id: 89 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/happy-number/README.md b/happy-number/README.md new file mode 100644 index 0000000..e69de29 diff --git a/happy-number/Solution.java b/happy-number/Solution.java new file mode 100644 index 0000000..c31546f --- /dev/null +++ b/happy-number/Solution.java @@ -0,0 +1,33 @@ +public class Solution { + + int trans(int n){ + int s = 0; + + do{ + int t = n % 10; + + s += t * t; + + n /= 10; + + } while(n > 0); + + return s; + } + + public boolean isHappy(int n) { + Set s = new HashSet<>(); + + for(;;) { + + n = trans(n); + + if(n == 1) return true; + + if(s.contains(n)) return false; + + s.add(n); + } + + } +} diff --git a/happy-number/index.md b/happy-number/index.md new file mode 100644 index 0000000..a5d1230 --- /dev/null +++ b/happy-number/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Happy Number +date: 2015-04-22 12:34:48 +0800 +leetcode_id: 202 +--- +{% include_relative README.md %} diff --git a/house-robber-ii/README.md b/house-robber-ii/README.md new file mode 100644 index 0000000..e69de29 diff --git a/house-robber-ii/Solution.java b/house-robber-ii/Solution.java new file mode 100644 index 0000000..664af93 --- /dev/null +++ b/house-robber-ii/Solution.java @@ -0,0 +1,27 @@ +public class Solution { + + // rob1 + int rob(int[] num, int st, int len) { + if(len == 0) return 0; + if(len == 1) return num[st + 0]; + + int[] P = new int[len]; + + P[0] = num[st + 0]; + P[1] = Math.max(num[st + 0], num[st + 1]); + + for(int i = 2; i < len; i++){ + P[i] = Math.max(num[st + i] + P[i - 2], P[i - 1]); + } + + return P[len - 1]; + } + + public int rob(int[] nums) { + + if(nums.length == 0) return 0; + if(nums.length == 1) return nums[0]; + + return Math.max(rob(nums, 0, nums.length - 1), rob(nums, 1, nums.length - 1)); + } +} diff --git a/house-robber-ii/index.md b/house-robber-ii/index.md new file mode 100644 index 0000000..af9e2f7 --- /dev/null +++ b/house-robber-ii/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: House Robber II +date: 2015-05-20 11:52:10+08:00 +leetcode_id: 213 +--- +{% include_relative README.md %} diff --git a/house-robber/README.md b/house-robber/README.md index 2ebe8c4..c694a4d 100644 --- a/house-robber/README.md +++ b/house-robber/README.md @@ -1,7 +1,7 @@ ## Rob or not assume that there are 9 houses along the street -and you have a `rob` func can tell you the how much money you can get from first 8 hourses. +and you have a `rob` func can tell you the how much money you can get from first 8 houses. what about the 9th house diff --git a/house-robber/index.md b/house-robber/index.md index 80859c3..cae3cf8 100644 --- a/house-robber/index.md +++ b/house-robber/index.md @@ -4,6 +4,4 @@ title: House Robber date: 2015-03-31 20:10:39 +0800 leetcode_id: 198 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/implement-queue-using-stacks/README.md b/implement-queue-using-stacks/README.md new file mode 100644 index 0000000..e69de29 diff --git a/implement-queue-using-stacks/Solution.java b/implement-queue-using-stacks/Solution.java new file mode 100644 index 0000000..c5a336a --- /dev/null +++ b/implement-queue-using-stacks/Solution.java @@ -0,0 +1,35 @@ +class MyQueue { + + // should use Deque stack in modern java + Stack stack = new Stack<>(); + + // Push element x to the back of queue. + public void push(int x) { + Stack rev = new Stack<>(); + + while(!stack.empty()){ + rev.push(stack.pop()); + } + + rev.push(x); + + while(!rev.empty()){ + stack.push(rev.pop()); + } + } + + // Removes the element from in front of queue. + public void pop() { + stack.pop(); + } + + // Get the front element. + public int peek() { + return stack.peek(); + } + + // Return whether the queue is empty. + public boolean empty() { + return stack.empty(); + } +} diff --git a/implement-queue-using-stacks/index.md b/implement-queue-using-stacks/index.md new file mode 100644 index 0000000..90c5ceb --- /dev/null +++ b/implement-queue-using-stacks/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Implement Queue using Stacks +date: 2015-07-07 21:04:46+08:00 +leetcode_id: 232 +--- +{% include_relative README.md %} diff --git a/implement-stack-using-queues/MyStack.java b/implement-stack-using-queues/MyStack.java new file mode 120000 index 0000000..e570129 --- /dev/null +++ b/implement-stack-using-queues/MyStack.java @@ -0,0 +1 @@ +Solution.java \ No newline at end of file diff --git a/implement-stack-using-queues/README.md b/implement-stack-using-queues/README.md new file mode 100644 index 0000000..e69de29 diff --git a/implement-stack-using-queues/Solution.java b/implement-stack-using-queues/Solution.java new file mode 100644 index 0000000..075ca38 --- /dev/null +++ b/implement-stack-using-queues/Solution.java @@ -0,0 +1,34 @@ +class MyStack { + + Queue queue = new LinkedList<>(); + + // Push element x onto stack. + public void push(int x) { + Queue swap = new LinkedList<>(); + + swap.add(x); + + while(!queue.isEmpty()){ + swap.add(queue.remove()); + } + + queue = swap; + } + + // Removes the element on top of the stack. + public void pop() { + // pop from front + queue.remove(); + } + + // Get the top element. + public int top() { + // peek from front + return queue.peek(); + } + + // Return whether the stack is empty. + public boolean empty() { + return queue.isEmpty(); + } +} diff --git a/implement-stack-using-queues/index.md b/implement-stack-using-queues/index.md new file mode 100644 index 0000000..25ede72 --- /dev/null +++ b/implement-stack-using-queues/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Implement Stack using Queues +date: 2015-06-28 15:56:53+08:00 +leetcode_id: 225 +--- +{% include_relative README.md %} diff --git a/implement-strstr/index.md b/implement-strstr/index.md index 193d19d..22fb12e 100644 --- a/implement-strstr/index.md +++ b/implement-strstr/index.md @@ -4,6 +4,4 @@ title: Implement strStr() date: 2014-12-29 00:26:24 +0800 leetcode_id: 28 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/implement-trie-prefix-tree/README.md b/implement-trie-prefix-tree/README.md new file mode 100644 index 0000000..e69de29 diff --git a/implement-trie-prefix-tree/Solution.java b/implement-trie-prefix-tree/Solution.java new file mode 100644 index 0000000..ed93530 --- /dev/null +++ b/implement-trie-prefix-tree/Solution.java @@ -0,0 +1,91 @@ +class TrieNode { + // Initialize your data structure here. + + TrieNode[] children = new TrieNode[26]; + + int count = 0; + + public TrieNode() { + + } + + TrieNode safe(int i){ + if(children[i] == null){ + children[i] = new TrieNode(); + } + + return children[i]; + } + + int index(char c){ + return (int)(c - 'a'); + } + + void insert(char[] word, int st, int len){ + if(len == 0){ + this.count++; + return; + } + + TrieNode t = safe(index(word[st])); + + t.insert(word, st + 1, len - 1); + } + + boolean search(char[] word, int st, int len){ + if(len == 0){ + return this.count > 0; + } + + TrieNode t = children[index(word[st])]; + + if(t == null){ + return false; + } + + return t.search(word, st + 1, len - 1); + } + + boolean startsWith(char[] prefix, int st, int len) { + if(len == 0){ + return true; + } + + TrieNode t = children[index(prefix[st])]; + + if(t == null){ + return false; + } + + return t.startsWith(prefix, st + 1, len - 1); + } +} + +public class Trie { + private TrieNode root; + + public Trie() { + root = new TrieNode(); + } + + // Inserts a word into the trie. + public void insert(String word) { + root.insert(word.toCharArray(), 0, word.length()); + } + + // Returns if the word is in the trie. + public boolean search(String word) { + return root.search(word.toCharArray(), 0, word.length()); + } + + // Returns if there is any word in the trie + // that starts with the given prefix. + public boolean startsWith(String prefix) { + return root.startsWith(prefix.toCharArray(), 0, prefix.length()); + } +} + +// Your Trie object will be instantiated and called as such: +// Trie trie = new Trie(); +// trie.insert("somestring"); +// trie.search("key"); diff --git a/implement-trie-prefix-tree/Trie.java b/implement-trie-prefix-tree/Trie.java new file mode 120000 index 0000000..e570129 --- /dev/null +++ b/implement-trie-prefix-tree/Trie.java @@ -0,0 +1 @@ +Solution.java \ No newline at end of file diff --git a/implement-trie-prefix-tree/index.md b/implement-trie-prefix-tree/index.md new file mode 100644 index 0000000..d0a19ec --- /dev/null +++ b/implement-trie-prefix-tree/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Implement Trie (Prefix Tree) +date: 2015-05-09 00:01:09 +0800 +leetcode_id: 208 +--- +{% include_relative README.md %} diff --git a/inorder-successor-in-bst/README.md b/inorder-successor-in-bst/README.md new file mode 100644 index 0000000..e69de29 diff --git a/inorder-successor-in-bst/Solution.java b/inorder-successor-in-bst/Solution.java new file mode 100644 index 0000000..a10605e --- /dev/null +++ b/inorder-successor-in-bst/Solution.java @@ -0,0 +1,35 @@ +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode(int x) { val = x; } + * } + */ +public class Solution { + + TreeNode leftMost(TreeNode root){ + if(root == null) return null; + if(root.left != null) return leftMost(root.left); + return root; + } + + public TreeNode inorderSuccessor(TreeNode root, TreeNode p) { + if(root == p) { + return leftMost(p.right); + } + + if(p.val < root.val) { + p = inorderSuccessor(root.left, p); + + if(p == null){ + return root; + } + + return p; + } + + return inorderSuccessor(root.right, p); + } +} diff --git a/inorder-successor-in-bst/index.md b/inorder-successor-in-bst/index.md new file mode 100644 index 0000000..a1a952d --- /dev/null +++ b/inorder-successor-in-bst/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Inorder Successor in BST +date: 2015-09-24 17:32:03+08:00 +leetcode_id: 285 +--- +{% include_relative README.md %} diff --git a/insert-interval/index.md b/insert-interval/index.md index 373a916..5f9b647 100644 --- a/insert-interval/index.md +++ b/insert-interval/index.md @@ -4,6 +4,4 @@ title: Insert Interval date: 2014-12-29 00:26:24 +0800 leetcode_id: 57 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/insertion-sort-list/index.md b/insertion-sort-list/index.md index dd80efc..94888a1 100644 --- a/insertion-sort-list/index.md +++ b/insertion-sort-list/index.md @@ -4,6 +4,4 @@ title: Insertion Sort List date: 2014-12-29 00:26:24 +0800 leetcode_id: 147 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/integer-to-roman/index.md b/integer-to-roman/index.md index 8247fb7..dac44a6 100644 --- a/integer-to-roman/index.md +++ b/integer-to-roman/index.md @@ -4,6 +4,4 @@ title: Integer to Roman date: 2014-12-29 00:26:24 +0800 leetcode_id: 12 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/interleaving-string/index.md b/interleaving-string/index.md index b02643e..cdc5248 100644 --- a/interleaving-string/index.md +++ b/interleaving-string/index.md @@ -4,6 +4,4 @@ title: Interleaving String date: 2014-12-29 00:26:24 +0800 leetcode_id: 97 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/intersection-of-two-linked-lists/index.md b/intersection-of-two-linked-lists/index.md index 8b96b46..54e299d 100644 --- a/intersection-of-two-linked-lists/index.md +++ b/intersection-of-two-linked-lists/index.md @@ -4,6 +4,4 @@ title: Intersection of Two Linked Lists date: 2014-12-29 00:26:24 +0800 leetcode_id: 160 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/invert-binary-tree/README.md b/invert-binary-tree/README.md new file mode 100644 index 0000000..e69de29 diff --git a/invert-binary-tree/Solution.java b/invert-binary-tree/Solution.java new file mode 100644 index 0000000..f07e3a5 --- /dev/null +++ b/invert-binary-tree/Solution.java @@ -0,0 +1,22 @@ +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode(int x) { val = x; } + * } + */ +public class Solution { + public TreeNode invertTree(TreeNode root) { + if(root == null) return null; + + TreeNode newLeft = invertTree(root.right); + TreeNode newRight = invertTree(root.left); + + root.left = newLeft; + root.right = newRight; + + return root; + } +} diff --git a/invert-binary-tree/index.md b/invert-binary-tree/index.md new file mode 100644 index 0000000..451ca81 --- /dev/null +++ b/invert-binary-tree/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Invert Binary Tree +date: 2015-06-28 15:39:51+08:00 +leetcode_id: 226 +--- +{% include_relative README.md %} diff --git a/isomorphic-strings/README.md b/isomorphic-strings/README.md new file mode 100644 index 0000000..e69de29 diff --git a/isomorphic-strings/Solution.java b/isomorphic-strings/Solution.java new file mode 100644 index 0000000..ad85b88 --- /dev/null +++ b/isomorphic-strings/Solution.java @@ -0,0 +1,33 @@ +public class Solution { + + boolean isIsomorphic(char[] S, char[] T) { + char[] MAP = new char[256]; + + for(int i = 0; i < S.length; i++) { + + if(MAP[(int)S[i]] == 0) { + // not mapped + MAP[(int)S[i]] = T[i]; + } else { + + if ( MAP[(int)S[i]] != T[i]) { + return false; + } + } + + } + + return true; + } + + public boolean isIsomorphic(String s, String t) { + + char[] S = s.toCharArray(); + char[] T = t.toCharArray(); + + if(S.length != T.length) return false; + + return isIsomorphic(S, T) && isIsomorphic(T, S); + + } +} diff --git a/isomorphic-strings/index.md b/isomorphic-strings/index.md new file mode 100644 index 0000000..d5aa475 --- /dev/null +++ b/isomorphic-strings/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Isomorphic Strings +date: 2015-04-29 12:09:06 +0800 +leetcode_id: 205 +--- +{% include_relative README.md %} diff --git a/jump-game-ii/index.md b/jump-game-ii/index.md index 0dcabcf..89100fd 100644 --- a/jump-game-ii/index.md +++ b/jump-game-ii/index.md @@ -4,6 +4,4 @@ title: Jump Game II date: 2014-12-29 00:26:24 +0800 leetcode_id: 45 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/jump-game/index.md b/jump-game/index.md index a85e7aa..b11ba12 100644 --- a/jump-game/index.md +++ b/jump-game/index.md @@ -4,6 +4,4 @@ title: Jump Game date: 2014-12-29 00:26:24 +0800 leetcode_id: 55 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/kth-largest-element-in-an-array/README.md b/kth-largest-element-in-an-array/README.md new file mode 100644 index 0000000..0163a90 --- /dev/null +++ b/kth-largest-element-in-an-array/README.md @@ -0,0 +1 @@ +[An `O(n)` solution in Guava](https://github.com/google/guava/blob/v18.0/guava/src/com/google/common/collect/Ordering.java#L666) diff --git a/kth-largest-element-in-an-array/Solution.java b/kth-largest-element-in-an-array/Solution.java new file mode 100644 index 0000000..749278b --- /dev/null +++ b/kth-largest-element-in-an-array/Solution.java @@ -0,0 +1,83 @@ +public class Solution { + + static class MinHeap { + + int[] data; + + int currentSize = 0; + + MinHeap(int size){ + data = new int[size]; + } + + int parent(int i){ + return (i - 1) / 2; + } + + int left(int i){ + return 2 * i + 1; + } + + int right(int i){ + return 2 * i + 2; + } + + void add(int n){ + int i = currentSize; + currentSize++; + + data[i] = n; + + while(i > 0 && data[parent(i)] > data[i]){ + swap(parent(i), i); + i = parent(i); + } + } + + void heapify(int i){ + + int l = left(i); + int r = right(i); + int min = i; + + if(l < currentSize && data[l] < data[min]){ + min = l; + } + + if(r < currentSize && data[r] < data[min]){ + min = r; + } + + if(min != i){ + swap(i, min); + heapify(min); + } + + } + + void swap(int x, int y){ + int t = data[x]; + data[x] = data[y]; + data[y] = t; + } + } + + public int findKthLargest(int[] nums, int k) { + + MinHeap heap = new MinHeap(k); + + for(int i = 0; i < Math.min(nums.length, k); i++){ + heap.add(nums[i]); + } + + for(int i = k; i < nums.length; i++){ + + if(heap.data[0] < nums[i]){ + heap.data[0] = nums[i]; + heap.heapify(0); + } + } + + return heap.data[0]; + } +} diff --git a/kth-largest-element-in-an-array/index.md b/kth-largest-element-in-an-array/index.md new file mode 100644 index 0000000..403edfb --- /dev/null +++ b/kth-largest-element-in-an-array/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Kth Largest Element in an Array +date: 2015-05-26 01:30:24+08:00 +leetcode_id: 215 +--- +{% include_relative README.md %} diff --git a/kth-smallest-element-in-a-bst/README.md b/kth-smallest-element-in-a-bst/README.md new file mode 100644 index 0000000..e69de29 diff --git a/kth-smallest-element-in-a-bst/Solution.java b/kth-smallest-element-in-a-bst/Solution.java new file mode 100644 index 0000000..0af45bc --- /dev/null +++ b/kth-smallest-element-in-a-bst/Solution.java @@ -0,0 +1,51 @@ +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode(int x) { val = x; } + * } + */ +public class Solution { + + boolean reachLeftMost = false; + boolean stop = false; + + int kth = 0; + int k = 0; + + void search(TreeNode root) { + + if(stop){ + return; + } + + // visit + if(root == null){ + reachLeftMost = true; + return; + } + + search(root.left); + + if(reachLeftMost) { + k--; + } + + if(k == 0){ + kth = root.val; + stop = true; + return; + } + + search(root.right); + } + + public int kthSmallest(TreeNode root, int k) { + this.k = k; + search(root); + + return kth; + } +} diff --git a/kth-smallest-element-in-a-bst/index.md b/kth-smallest-element-in-a-bst/index.md new file mode 100644 index 0000000..e34b4f0 --- /dev/null +++ b/kth-smallest-element-in-a-bst/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Kth Smallest Element in a BST +date: 2015-07-02 14:16:21+08:00 +leetcode_id: 230 +--- +{% include_relative README.md %} diff --git a/largest-number/index.md b/largest-number/index.md index 82c2ac1..d9076ab 100644 --- a/largest-number/index.md +++ b/largest-number/index.md @@ -4,6 +4,4 @@ title: Largest Number date: 2015-01-21 17:33:39 +0800 leetcode_id: 179 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/largest-rectangle-in-histogram/index.md b/largest-rectangle-in-histogram/index.md index 0fe1e19..944918e 100644 --- a/largest-rectangle-in-histogram/index.md +++ b/largest-rectangle-in-histogram/index.md @@ -4,6 +4,4 @@ title: Largest Rectangle in Histogram date: 2014-12-29 00:26:24 +0800 leetcode_id: 84 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/length-of-last-word/index.md b/length-of-last-word/index.md index b7075e0..7e402d7 100644 --- a/length-of-last-word/index.md +++ b/length-of-last-word/index.md @@ -4,6 +4,4 @@ title: Length of Last Word date: 2014-12-29 00:26:24 +0800 leetcode_id: 58 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/letter-combinations-of-a-phone-number/index.md b/letter-combinations-of-a-phone-number/index.md index 8c9632e..3a8fd7b 100644 --- a/letter-combinations-of-a-phone-number/index.md +++ b/letter-combinations-of-a-phone-number/index.md @@ -4,6 +4,4 @@ title: Letter Combinations of a Phone Number date: 2015-01-18 03:28:07 +0800 leetcode_id: 17 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/linked-list-cycle-ii/index.md b/linked-list-cycle-ii/index.md index e872762..fc84214 100644 --- a/linked-list-cycle-ii/index.md +++ b/linked-list-cycle-ii/index.md @@ -4,6 +4,4 @@ title: Linked List Cycle II date: 2014-12-29 00:26:24 +0800 leetcode_id: 142 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/linked-list-cycle/index.md b/linked-list-cycle/index.md index 7829596..9d057f3 100644 --- a/linked-list-cycle/index.md +++ b/linked-list-cycle/index.md @@ -4,6 +4,4 @@ title: Linked List Cycle date: 2014-12-29 00:26:24 +0800 leetcode_id: 141 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/longest-common-prefix/index.md b/longest-common-prefix/index.md index 78fc4f3..28d695c 100644 --- a/longest-common-prefix/index.md +++ b/longest-common-prefix/index.md @@ -4,6 +4,4 @@ title: Longest Common Prefix date: 2014-12-29 00:26:24 +0800 leetcode_id: 14 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/longest-consecutive-sequence/index.md b/longest-consecutive-sequence/index.md index 5553e49..cbfb422 100644 --- a/longest-consecutive-sequence/index.md +++ b/longest-consecutive-sequence/index.md @@ -4,6 +4,4 @@ title: Longest Consecutive Sequence date: 2014-12-29 00:26:24 +0800 leetcode_id: 128 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/longest-palindromic-substring/index.md b/longest-palindromic-substring/index.md index 2f5b645..a5b9457 100644 --- a/longest-palindromic-substring/index.md +++ b/longest-palindromic-substring/index.md @@ -4,6 +4,4 @@ title: Longest Palindromic Substring date: 2014-12-29 00:26:24 +0800 leetcode_id: 5 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/longest-substring-with-at-most-two-distinct-characters/index.md b/longest-substring-with-at-most-two-distinct-characters/index.md index c1b808a..598f768 100644 --- a/longest-substring-with-at-most-two-distinct-characters/index.md +++ b/longest-substring-with-at-most-two-distinct-characters/index.md @@ -4,6 +4,4 @@ title: Longest Substring with At Most Two Distinct Characters date: 2014-12-29 00:26:24 +0800 leetcode_id: 159 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/longest-substring-without-repeating-characters/index.md b/longest-substring-without-repeating-characters/index.md index 868db91..8ca0b66 100644 --- a/longest-substring-without-repeating-characters/index.md +++ b/longest-substring-without-repeating-characters/index.md @@ -4,6 +4,4 @@ title: Longest Substring Without Repeating Characters date: 2014-12-29 00:26:24 +0800 leetcode_id: 3 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/longest-valid-parentheses/index.md b/longest-valid-parentheses/index.md index b010d76..a52481a 100644 --- a/longest-valid-parentheses/index.md +++ b/longest-valid-parentheses/index.md @@ -4,6 +4,4 @@ title: Longest Valid Parentheses date: 2014-12-29 00:26:24 +0800 leetcode_id: 32 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/lowest-common-ancestor-of-a-binary-search-tree/README.md b/lowest-common-ancestor-of-a-binary-search-tree/README.md new file mode 100644 index 0000000..e69de29 diff --git a/lowest-common-ancestor-of-a-binary-search-tree/Solution.java b/lowest-common-ancestor-of-a-binary-search-tree/Solution.java new file mode 100644 index 0000000..1047289 --- /dev/null +++ b/lowest-common-ancestor-of-a-binary-search-tree/Solution.java @@ -0,0 +1,28 @@ +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode(int x) { val = x; } + * } + */ +public class Solution { + public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { + // make sure p < q + if(p.val > q.val) return lowestCommonAncestor(root, q, p); + + // find p <= root <= q + while(!(p.val <= root.val && root.val <= q.val)){ + + if(root.val > q.val){ + root = root.left; + } else { // root.val < p.val + root = root.right; + } + + } + + return root; + } +} diff --git a/lowest-common-ancestor-of-a-binary-search-tree/index.md b/lowest-common-ancestor-of-a-binary-search-tree/index.md new file mode 100644 index 0000000..5dae6aa --- /dev/null +++ b/lowest-common-ancestor-of-a-binary-search-tree/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Lowest Common Ancestor of a Binary Search Tree +date: 2015-07-12 16:47:16+08:00 +leetcode_id: 235 +--- +{% include_relative README.md %} diff --git a/lowest-common-ancestor-of-a-binary-tree/README.md b/lowest-common-ancestor-of-a-binary-tree/README.md new file mode 100644 index 0000000..e69de29 diff --git a/lowest-common-ancestor-of-a-binary-tree/Solution.java b/lowest-common-ancestor-of-a-binary-tree/Solution.java new file mode 100644 index 0000000..99fef31 --- /dev/null +++ b/lowest-common-ancestor-of-a-binary-tree/Solution.java @@ -0,0 +1,57 @@ +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode(int x) { val = x; } + * } + */ +public class Solution { + + TreeNode lca; + + TreeNode other; + + boolean containOther(TreeNode root){ + + if(root == null) return false; + + if(root == other) return true; + + return containOther(root.left) || containOther(root.right); + } + + void inorder(TreeNode root, TreeNode p, TreeNode q){ + if(lca != null) return; + + if(root == null) return; + + if(other == null) inorder(root.left, p, q); + + if(other == null){ + if(root == p){ + other = q; + } else if (root == q){ + other = p; + } + } + + if(other != null){ + // left contain one, need other + if(root == other || containOther(root.right)){ + lca = root; + } + } + + if(other == null) inorder(root.right, p, q); + } + + + public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { + // a bit ugly + inorder(root, p, q); + + return lca; + } +} diff --git a/lowest-common-ancestor-of-a-binary-tree/index.md b/lowest-common-ancestor-of-a-binary-tree/index.md new file mode 100644 index 0000000..ef8ac7f --- /dev/null +++ b/lowest-common-ancestor-of-a-binary-tree/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Lowest Common Ancestor of a Binary Tree +date: 2015-07-26 16:03:27+08:00 +leetcode_id: 236 +--- +{% include_relative README.md %} diff --git a/lru-cache/index.md b/lru-cache/index.md index 3197346..1cc0bc0 100644 --- a/lru-cache/index.md +++ b/lru-cache/index.md @@ -4,6 +4,4 @@ title: LRU Cache date: 2014-12-29 00:26:24 +0800 leetcode_id: 146 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/majority-element-ii/README.md b/majority-element-ii/README.md new file mode 100644 index 0000000..e69de29 diff --git a/majority-element-ii/Solution.java b/majority-element-ii/Solution.java new file mode 100644 index 0000000..a4d9b33 --- /dev/null +++ b/majority-element-ii/Solution.java @@ -0,0 +1,50 @@ +public class Solution { + public List majorityElement(int[] nums) { + if(nums.length == 0) return Collections.emptyList(); + + int n1 = nums[0]; + int n2 = nums[0]; + + int c1 = 0; + int c2 = 0; + + for(int i = 0; i < nums.length; i++){ + + // put to an empty slot + if(c1 <= 0 && nums[i] != n2){ + n1 = nums[i]; + c1 = 1; + continue; + } + + if(c2 <= 0 && nums[i] != n1){ + n2 = nums[i]; + c2 = 1; + continue; + } + + // add count + if(nums[i] == n1){ + c1++; + continue; + } + + if(nums[i] == n2){ + c2++; + continue; + } + + // no match + + c1--; + c2--; + } + + // faint + return new ArrayList<>(IntStream.of(n1, n2) + .filter(n -> + Arrays.stream(nums).filter(i -> n == i).count() > nums.length / 3) + .boxed() + .collect(Collectors.toSet())); + } +} diff --git a/majority-element-ii/index.md b/majority-element-ii/index.md new file mode 100644 index 0000000..2e262bc --- /dev/null +++ b/majority-element-ii/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Majority Element II +date: 2015-06-29 13:42:29+08:00 +leetcode_id: 229 +--- +{% include_relative README.md %} diff --git a/majority-element/index.md b/majority-element/index.md index eafead8..e64ca8a 100644 --- a/majority-element/index.md +++ b/majority-element/index.md @@ -4,6 +4,4 @@ title: Majority Element date: 2015-01-03 03:53:03 +0800 leetcode_id: 169 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/max-points-on-a-line/index.md b/max-points-on-a-line/index.md index b237c67..559fd3e 100644 --- a/max-points-on-a-line/index.md +++ b/max-points-on-a-line/index.md @@ -4,6 +4,4 @@ title: Max Points on a Line date: 2014-12-29 00:26:24 +0800 leetcode_id: 149 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/maximal-rectangle/index.md b/maximal-rectangle/index.md index c04459b..72eee5b 100644 --- a/maximal-rectangle/index.md +++ b/maximal-rectangle/index.md @@ -4,6 +4,4 @@ title: Maximal Rectangle date: 2014-12-29 00:26:24 +0800 leetcode_id: 85 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/maximal-square/README.md b/maximal-square/README.md new file mode 100644 index 0000000..e69de29 diff --git a/maximal-square/Solution.java b/maximal-square/Solution.java new file mode 100644 index 0000000..9350e23 --- /dev/null +++ b/maximal-square/Solution.java @@ -0,0 +1,46 @@ +public class Solution { + + int maximalSquare(char[][] matrix, final int x, final int y){ + int l = 1; + + done: + while(true){ + + for(int i = 0; i <= l; i++){ + + if(x + l >= matrix.length || y + l >= matrix[0].length){ + break done; + } + + + if(matrix[x + l][y + i] != '1'){ + break done; + } + + if(matrix[x + i][y + l] != '1'){ + break done; + } + + } + + l++; + } + + return l * l; + } + + public int maximalSquare(char[][] matrix) { + + int max = 0; + + for(int x = 0; x < matrix.length; x++){ + for(int y = 0; y < matrix[0].length; y++){ + if(matrix[x][y] == '1'){ + max = Math.max(max, maximalSquare(matrix, x, y)); + } + } + } + + return max; + } +} diff --git a/maximal-square/index.md b/maximal-square/index.md new file mode 100644 index 0000000..142c600 --- /dev/null +++ b/maximal-square/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Maximal Square +date: 2015-06-04 23:46:46+08:00 +leetcode_id: 221 +--- +{% include_relative README.md %} diff --git a/maximum-depth-of-binary-tree/index.md b/maximum-depth-of-binary-tree/index.md index 6b3b4c2..ab5b064 100644 --- a/maximum-depth-of-binary-tree/index.md +++ b/maximum-depth-of-binary-tree/index.md @@ -4,6 +4,4 @@ title: Maximum Depth of Binary Tree date: 2014-12-29 00:26:24 +0800 leetcode_id: 104 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/maximum-gap/index.md b/maximum-gap/index.md index b87796f..698f2c3 100644 --- a/maximum-gap/index.md +++ b/maximum-gap/index.md @@ -4,6 +4,4 @@ title: Maximum Gap date: 2014-12-29 00:26:24 +0800 leetcode_id: 164 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/maximum-product-subarray/index.md b/maximum-product-subarray/index.md index b62014f..c5ac74a 100644 --- a/maximum-product-subarray/index.md +++ b/maximum-product-subarray/index.md @@ -4,6 +4,4 @@ title: Maximum Product Subarray date: 2014-09-24 23:57:39 +0800 leetcode_id: 152 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/maximum-subarray/index.md b/maximum-subarray/index.md index e91f5a3..a500d33 100644 --- a/maximum-subarray/index.md +++ b/maximum-subarray/index.md @@ -4,6 +4,4 @@ title: Maximum Subarray date: 2014-12-29 00:26:24 +0800 leetcode_id: 53 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/median-of-two-sorted-arrays/index.md b/median-of-two-sorted-arrays/index.md index 8c294ec..d520b30 100644 --- a/median-of-two-sorted-arrays/index.md +++ b/median-of-two-sorted-arrays/index.md @@ -4,6 +4,4 @@ title: Median of Two Sorted Arrays date: 2014-12-29 00:26:24 +0800 leetcode_id: 4 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/meeting-rooms-ii/README.md b/meeting-rooms-ii/README.md new file mode 100644 index 0000000..e69de29 diff --git a/meeting-rooms-ii/Solution.java b/meeting-rooms-ii/Solution.java new file mode 100644 index 0000000..7f00416 --- /dev/null +++ b/meeting-rooms-ii/Solution.java @@ -0,0 +1,46 @@ +/** + * Definition for an interval. + * public class Interval { + * int start; + * int end; + * Interval() { start = 0; end = 0; } + * Interval(int s, int e) { start = s; end = e; } + * } + */ +public class Solution { + + static class RoomAllocator { + + List rooms = new ArrayList<>(); + + int currentTime = -1; + + void alloc(Interval room){ + for(int i = 0; i < rooms.size(); i++){ + if(rooms.get(i).end <= currentTime){ + rooms.set(i, room); + return; + } + } + + rooms.add(room); + } + + void freeBefore(int time){ + currentTime = time; + } + } + + public int minMeetingRooms(Interval[] intervals) { + Arrays.sort(intervals, (a, b) -> a.start - b.start); + + RoomAllocator ra = new RoomAllocator(); + + for(Interval i : intervals){ + ra.freeBefore(i.start); + ra.alloc(i); + } + + return ra.rooms.size(); + } +} diff --git a/meeting-rooms-ii/index.md b/meeting-rooms-ii/index.md new file mode 100644 index 0000000..cf55133 --- /dev/null +++ b/meeting-rooms-ii/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Meeting Rooms II +date: 2015-08-12 20:03:46+08:00 +leetcode_id: 253 +--- +{% include_relative README.md %} diff --git a/meeting-rooms/README.md b/meeting-rooms/README.md new file mode 100644 index 0000000..e69de29 diff --git a/meeting-rooms/Solution.java b/meeting-rooms/Solution.java new file mode 100644 index 0000000..c7d0eba --- /dev/null +++ b/meeting-rooms/Solution.java @@ -0,0 +1,26 @@ +/** + * Definition for an interval. + * public class Interval { + * int start; + * int end; + * Interval() { start = 0; end = 0; } + * Interval(int s, int e) { start = s; end = e; } + * } + */ +public class Solution { + public boolean canAttendMeetings(Interval[] intervals) { + Arrays.sort(intervals, (a, b) -> a.start - b.start); + + int maxend = 0; + + for(Interval i : intervals){ + if(i.start < maxend){ + return false; + } + + maxend = Math.max(maxend, i.end); + } + + return true; + } +} diff --git a/meeting-rooms/index.md b/meeting-rooms/index.md new file mode 100644 index 0000000..3b7e736 --- /dev/null +++ b/meeting-rooms/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Meeting Rooms +date: 2015-08-12 20:02:37+08:00 +leetcode_id: 252 +--- +{% include_relative README.md %} diff --git a/merge-intervals/index.md b/merge-intervals/index.md index 59998c2..255fc48 100644 --- a/merge-intervals/index.md +++ b/merge-intervals/index.md @@ -4,6 +4,4 @@ title: Merge Intervals date: 2014-12-29 00:26:24 +0800 leetcode_id: 56 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/merge-k-sorted-lists/index.md b/merge-k-sorted-lists/index.md index 756ff07..2d796fd 100644 --- a/merge-k-sorted-lists/index.md +++ b/merge-k-sorted-lists/index.md @@ -4,6 +4,4 @@ title: Merge k Sorted Lists date: 2014-12-29 00:26:24 +0800 leetcode_id: 23 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/merge-sorted-array/index.md b/merge-sorted-array/index.md index c78f3e7..4775d36 100644 --- a/merge-sorted-array/index.md +++ b/merge-sorted-array/index.md @@ -4,6 +4,4 @@ title: Merge Sorted Array date: 2015-02-13 00:34:52 +0800 leetcode_id: 88 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/merge-two-sorted-lists/index.md b/merge-two-sorted-lists/index.md index 15358d2..53c2277 100644 --- a/merge-two-sorted-lists/index.md +++ b/merge-two-sorted-lists/index.md @@ -4,6 +4,4 @@ title: Merge Two Sorted Lists date: 2014-12-29 00:26:24 +0800 leetcode_id: 21 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/min-stack/index.md b/min-stack/index.md index 4e7143f..d1114de 100644 --- a/min-stack/index.md +++ b/min-stack/index.md @@ -4,6 +4,4 @@ title: Min Stack date: 2014-11-18 00:59:34 +0800 leetcode_id: 155 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/minimum-depth-of-binary-tree/index.md b/minimum-depth-of-binary-tree/index.md index f97d54f..35d2a27 100644 --- a/minimum-depth-of-binary-tree/index.md +++ b/minimum-depth-of-binary-tree/index.md @@ -4,6 +4,4 @@ title: Minimum Depth of Binary Tree date: 2014-12-29 00:26:24 +0800 leetcode_id: 111 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/minimum-path-sum/index.md b/minimum-path-sum/index.md index 0ad9aac..56e4fa4 100644 --- a/minimum-path-sum/index.md +++ b/minimum-path-sum/index.md @@ -4,6 +4,4 @@ title: Minimum Path Sum date: 2014-12-29 00:26:24 +0800 leetcode_id: 64 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/minimum-size-subarray-sum/README.md b/minimum-size-subarray-sum/README.md new file mode 100644 index 0000000..e69de29 diff --git a/minimum-size-subarray-sum/Solution.java b/minimum-size-subarray-sum/Solution.java new file mode 100644 index 0000000..a291a9e --- /dev/null +++ b/minimum-size-subarray-sum/Solution.java @@ -0,0 +1,30 @@ +public class Solution { + public int minSubArrayLen(int s, int[] nums) { + + int sum = 0; + + int st = 0; + + int c = nums.length + 1; + + for (int i = 0; i < nums.length; i++) { + + sum += nums[i]; + + if(sum >= s){ + while(sum - nums[st] >= s) { + sum -= nums[st++]; + } + + c = Math.min(c, i - st + 1); + } + + } + + if(c > nums.length) { + return 0; + } + + return c; + } +} diff --git a/minimum-size-subarray-sum/index.md b/minimum-size-subarray-sum/index.md new file mode 100644 index 0000000..feff633 --- /dev/null +++ b/minimum-size-subarray-sum/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Minimum Size Subarray Sum +date: 2015-05-12 14:45:40+08:00 +leetcode_id: 209 +--- +{% include_relative README.md %} diff --git a/minimum-window-substring/index.md b/minimum-window-substring/index.md index ee153da..e2509fc 100644 --- a/minimum-window-substring/index.md +++ b/minimum-window-substring/index.md @@ -4,6 +4,4 @@ title: Minimum Window Substring date: 2014-12-29 00:26:24 +0800 leetcode_id: 76 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/missing-number/README.md b/missing-number/README.md new file mode 100644 index 0000000..e69de29 diff --git a/missing-number/Solution.java b/missing-number/Solution.java new file mode 100644 index 0000000..6d7e053 --- /dev/null +++ b/missing-number/Solution.java @@ -0,0 +1,36 @@ +public class Solution { + + void swap(int[] nums, int i, int j){ + int t = nums[i]; + nums[i] = nums[j]; + nums[j] = t; + } + + void sort(int[] nums){ + + for(int i = 0; i < nums.length; i++){ + while(nums[i] != i){ + if(nums[i] < 0) break; + + if(nums[i] >= nums.length) { + nums[i] = -1; + break; // drop + } + + swap(nums, nums[i], i); + } + } + } + + public int missingNumber(int[] nums) { + sort(nums); + + for(int i = 0; i < nums.length; i++){ + if(nums[i] != i){ + return i; + } + } + + return nums.length; + } +} diff --git a/missing-number/index.md b/missing-number/index.md new file mode 100644 index 0000000..8ec826c --- /dev/null +++ b/missing-number/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Missing Number +date: 2015-08-24 12:56:25+08:00 +leetcode_id: 268 +--- +{% include_relative README.md %} diff --git a/missing-ranges/index.md b/missing-ranges/index.md index 3a15aa8..ab887ea 100644 --- a/missing-ranges/index.md +++ b/missing-ranges/index.md @@ -4,6 +4,4 @@ title: Missing Ranges date: 2014-12-29 00:26:24 +0800 leetcode_id: 163 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/move-zeroes/README.md b/move-zeroes/README.md new file mode 100644 index 0000000..e69de29 diff --git a/move-zeroes/Solution.java b/move-zeroes/Solution.java new file mode 100644 index 0000000..d02e5f2 --- /dev/null +++ b/move-zeroes/Solution.java @@ -0,0 +1,49 @@ +public class Solution { + + void shiftLeft(int[] nums, int p, final int c){ + if(c <= 0) return; + + while(p < nums.length){ + nums[p - c] = nums[p]; + + if(nums[p] == 0) break; + + p++; + } + + for(int i = p - c; i < p; i++){ + nums[i] = 0; + } + } + + public void moveZeroes(int[] nums) { + + int i = nums.length - 1; + + // trim tailing zero + while(i >= 0 && nums[i] == 0) i--; + + int s = i; + + boolean metzero = false; + + while(i >= 0){ + + if(nums[i] != 0){ + + if(metzero){ + shiftLeft(nums, s, s - i - 1); + metzero = false; + } + + s = i; + } else { + metzero = true; + } + + i--; + } + + shiftLeft(nums, s, s); + } +} diff --git a/move-zeroes/index.md b/move-zeroes/index.md new file mode 100644 index 0000000..5bddd19 --- /dev/null +++ b/move-zeroes/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Move Zeroes +date: 2015-09-24 15:55:37+08:00 +leetcode_id: 283 +--- +{% include_relative README.md %} diff --git a/multiply-strings/index.md b/multiply-strings/index.md index d23bae4..b2b7520 100644 --- a/multiply-strings/index.md +++ b/multiply-strings/index.md @@ -4,6 +4,4 @@ title: Multiply Strings date: 2014-12-29 00:26:24 +0800 leetcode_id: 43 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/n-queens-ii/index.md b/n-queens-ii/index.md index aa106c3..120f7ad 100644 --- a/n-queens-ii/index.md +++ b/n-queens-ii/index.md @@ -4,6 +4,4 @@ title: N-Queens II date: 2014-12-29 00:26:24 +0800 leetcode_id: 52 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/n-queens/index.md b/n-queens/index.md index 979bab5..5ca314c 100644 --- a/n-queens/index.md +++ b/n-queens/index.md @@ -4,6 +4,4 @@ title: N-Queens date: 2014-12-29 00:26:24 +0800 leetcode_id: 51 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/next-permutation/index.md b/next-permutation/index.md index 2484374..c7ef7be 100644 --- a/next-permutation/index.md +++ b/next-permutation/index.md @@ -4,6 +4,4 @@ title: Next Permutation date: 2014-12-29 00:26:24 +0800 leetcode_id: 31 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/number-of-1-bits/index.md b/number-of-1-bits/index.md index ea4fbeb..a1078c5 100644 --- a/number-of-1-bits/index.md +++ b/number-of-1-bits/index.md @@ -4,6 +4,4 @@ title: Number of 1 Bits date: 2015-03-10 12:33:10 +0800 leetcode_id: 191 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/number-of-digit-one/README.md b/number-of-digit-one/README.md new file mode 100644 index 0000000..e69de29 diff --git a/number-of-digit-one/Solution.java b/number-of-digit-one/Solution.java new file mode 100644 index 0000000..b90839a --- /dev/null +++ b/number-of-digit-one/Solution.java @@ -0,0 +1,57 @@ +public class Solution { + + // return { highest digit, floor(n) } + // 'floor' here has a naming problem... + // named it exactly later + // floor(101) = 100 + // floor(92) = 90 + // floor(10111) = 10000 + + int[] N = {100000000, 10000, 100, 10}; + + int[] extractHighest(int x){ + int e = 1; + + for(int n : N){ + if(x >= n){ + x /= n; + e *= n; + } + } + + return new int[]{x, x * e}; + } + + Map cache = new HashMap<>(); + + public int countDigitOne(int n) { + + if(n <= 0) return 0; + if(n < 10) return 1; + + Integer cached = cache.get(n); + + if(cached != null){ + return cached; + } + + int[] e = extractHighest(n); + + int h = e[0]; + int f = e[1]; + + int rest = n - f; + + int plus = 0; + + if(h == 1){ + plus = rest + 1; + } + + int c = plus + countDigitOne(f - 1) + countDigitOne(rest); + + cache.put(n, c); + + return c; + } +} diff --git a/number-of-digit-one/index.md b/number-of-digit-one/index.md new file mode 100644 index 0000000..2e2acbd --- /dev/null +++ b/number-of-digit-one/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Number of Digit One +date: 2015-07-08 00:39:17+08:00 +leetcode_id: 233 +--- +{% include_relative README.md %} diff --git a/number-of-islands/README.md b/number-of-islands/README.md new file mode 100644 index 0000000..e69de29 diff --git a/number-of-islands/Solution.java b/number-of-islands/Solution.java new file mode 100644 index 0000000..905ee55 --- /dev/null +++ b/number-of-islands/Solution.java @@ -0,0 +1,53 @@ +public class Solution { + + boolean allowed(int x, int y, final int mx, final int my, char[][] grid, boolean[][] visited){ + return (x < mx) && (x >= 0) + && (y < my) && (y >= 0) + && (grid[x][y] == '1') + && (!visited[x][y]); + } + + void travel(int x, int y, final int mx, final int my, char[][] grid, boolean[][] visited){ + + // x - 1, y + // x + 1, y + // x, y - 1 + // x, y + 1 + + visited[x][y] = true; + + for(int[] xy: new int[][]{ {x - 1, y}, {x + 1, y}, {x, y - 1}, {x, y + 1} }){ + + int _x = xy[0]; + int _y = xy[1]; + + if(allowed(_x, _y, mx, my, grid, visited)){ + travel(_x, _y, mx, my, grid, visited); + } + } + + } + + public int numIslands(char[][] grid) { + + final int mx = grid.length; + if(mx == 0) return 0; + final int my = grid[0].length; + + int count = 0; + boolean[][] visited = new boolean[mx][my]; + + for(int x = 0; x < mx; x++){ + for(int y = 0; y < my; y++){ + if(allowed(x, y, mx, my, grid, visited)){ + + travel(x, y, mx, my, grid, visited); + + count++; + } + } + } + + return count; + } +} diff --git a/number-of-islands/index.md b/number-of-islands/index.md new file mode 100644 index 0000000..7c4093a --- /dev/null +++ b/number-of-islands/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Number of Islands +date: 2015-04-08 15:07:58 +0800 +leetcode_id: 200 +--- +{% include_relative README.md %} diff --git a/one-edit-distance/index.md b/one-edit-distance/index.md index ff2ebd1..ec336b3 100644 --- a/one-edit-distance/index.md +++ b/one-edit-distance/index.md @@ -4,6 +4,4 @@ title: One Edit Distance date: 2014-12-29 00:26:24 +0800 leetcode_id: 161 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/paint-house/README.md b/paint-house/README.md new file mode 100644 index 0000000..e69de29 diff --git a/paint-house/Solution.java b/paint-house/Solution.java new file mode 100644 index 0000000..9cb1899 --- /dev/null +++ b/paint-house/Solution.java @@ -0,0 +1,45 @@ +public class Solution { + static final int RED = 0b001; + static final int BLUE = 0b010; + static final int GREEN = 0b100; + + static final int NONE = 0b000; + static final int ALL = 0b111; + + static final int[] COLORS = {RED, BLUE, GREEN}; + + int index(int color){ + return color / 2; + } + + int min(int[] costs, int exclude){ + int includes = ~(ALL & exclude); + + int min = Integer.MAX_VALUE; + for(int c : COLORS){ + if((c & includes) == c){ + min = Math.min(costs[index(c)], min); + } + } + + return min; + } + + public int minCost(int[][] costs) { + if(costs.length == 0) return 0; + + int[][] minCosts = new int[costs.length][COLORS.length]; + + for(int c : COLORS){ + minCosts[0][index(c)] = costs[0][index(c)]; + } + + for(int i = 1; i < costs.length; i++){ + for(int c : COLORS){ + minCosts[i][index(c)] = costs[i][index(c)] + min(minCosts[i - 1], c); + } + } + + return min(minCosts[costs.length - 1], NONE); + } +} diff --git a/paint-house/index.md b/paint-house/index.md new file mode 100644 index 0000000..37be63b --- /dev/null +++ b/paint-house/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Paint House +date: 2015-08-17 00:33:10+08:00 +leetcode_id: 256 +--- +{% include_relative README.md %} diff --git a/palindrome-linked-list/README.md b/palindrome-linked-list/README.md new file mode 100644 index 0000000..e69de29 diff --git a/palindrome-linked-list/Solution.java b/palindrome-linked-list/Solution.java new file mode 100644 index 0000000..0827711 --- /dev/null +++ b/palindrome-linked-list/Solution.java @@ -0,0 +1,56 @@ +/** + * Definition for singly-linked list. + * public class ListNode { + * int val; + * ListNode next; + * ListNode(int x) { val = x; } + * } + */ +public class Solution { + ListNode mid(ListNode head){ + + ListNode fast = head; + ListNode slow = head; + + while(fast != null && fast.next != null){ + fast = fast.next.next; + slow = slow.next; + } + + return slow; + } + + ListNode reverse(ListNode head) { + ListNode prev = null; + + while(head != null){ + + ListNode t = head.next; + + head.next = prev; + prev = head; + + head = t; + } + + return prev; + } + + public boolean isPalindrome(ListNode head) { + ListNode m = mid(head); + + m = reverse(m); + + while(m != head && m != null){ + + if(m.val != head.val){ + return false; + } + + m = m.next; + head = head.next; + } + + return true; + } +} diff --git a/palindrome-linked-list/index.md b/palindrome-linked-list/index.md new file mode 100644 index 0000000..bd04d46 --- /dev/null +++ b/palindrome-linked-list/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Palindrome Linked List +date: 2015-07-12 17:00:15+08:00 +leetcode_id: 234 +--- +{% include_relative README.md %} diff --git a/palindrome-number/index.md b/palindrome-number/index.md index b86af95..1c393a4 100644 --- a/palindrome-number/index.md +++ b/palindrome-number/index.md @@ -4,6 +4,4 @@ title: Palindrome Number date: 2015-02-16 17:43:10 +0800 leetcode_id: 9 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/palindrome-partitioning-ii/index.md b/palindrome-partitioning-ii/index.md index 92c6d4e..5f02f13 100644 --- a/palindrome-partitioning-ii/index.md +++ b/palindrome-partitioning-ii/index.md @@ -4,6 +4,4 @@ title: Palindrome Partitioning II date: 2014-12-29 00:26:24 +0800 leetcode_id: 132 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/palindrome-partitioning/index.md b/palindrome-partitioning/index.md index 167101f..6c9767d 100644 --- a/palindrome-partitioning/index.md +++ b/palindrome-partitioning/index.md @@ -4,6 +4,4 @@ title: Palindrome Partitioning date: 2014-12-29 00:26:24 +0800 leetcode_id: 131 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/palindrome-permutation-ii/README.md b/palindrome-permutation-ii/README.md new file mode 100644 index 0000000..e69de29 diff --git a/palindrome-permutation-ii/Solution.java b/palindrome-permutation-ii/Solution.java new file mode 100644 index 0000000..e62df14 --- /dev/null +++ b/palindrome-permutation-ii/Solution.java @@ -0,0 +1,58 @@ +public class Solution { + Set permute(ArrayList chars, final String single){ + + if(chars.isEmpty()){ + + return Collections.singleton(single); + } else if(chars.size() == 1) { + + return Collections.singleton(chars.get(0) + single + chars.get(0)); + } + + Set found = new HashSet<>(); + + // else + for(int i = 0; i < chars.size(); i++){ + + char c = chars.get(i); + + ArrayList rest = new ArrayList<>(chars); + rest.remove(i); + + found.addAll(permute(rest, single).stream() + .map(s -> c + s + c) + .collect(Collectors.toSet())); + } + + return found; + } + + public List generatePalindromes(String s) { + + + ArrayList chars = new ArrayList<>(); + + Set single = new HashSet<>(); + + for(char c : s.toCharArray()){ + + if(single.contains(c)){ + single.remove(c); + chars.add(c); + } else { + single.add(c); + } + } + + if(single.size() > 1) return Collections.emptyList(); + + // else + String _single = ""; + + if(single.size() == 1) { + _single = single.iterator().next() + ""; + } + + return new ArrayList<>(permute(chars, _single)); + } +} diff --git a/palindrome-permutation-ii/index.md b/palindrome-permutation-ii/index.md new file mode 100644 index 0000000..aba642c --- /dev/null +++ b/palindrome-permutation-ii/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Palindrome Permutation II +date: 2015-08-25 00:48:04+08:00 +leetcode_id: 267 +--- +{% include_relative README.md %} diff --git a/palindrome-permutation/README.md b/palindrome-permutation/README.md new file mode 100644 index 0000000..6d48e7a --- /dev/null +++ b/palindrome-permutation/README.md @@ -0,0 +1,3 @@ +## Counting Map + + diff --git a/palindrome-permutation/Solution.java b/palindrome-permutation/Solution.java new file mode 100644 index 0000000..68e78bb --- /dev/null +++ b/palindrome-permutation/Solution.java @@ -0,0 +1,29 @@ +public class Solution { + public boolean canPermutePalindrome(String s) { + Map m = new HashMap<>(); + + for(char c : s.toCharArray()){ + Integer i = m.get(c); + + if(i == null){ + m.put(c, 1); + } else { + m.put(c, i + 1); + } + } + + int single = 0; + + for(int v : m.values()){ + if(v % 2 == 1){ + single++; + } + + if(single > 1){ + return false; + } + } + + return true; + } +} diff --git a/palindrome-permutation/index.md b/palindrome-permutation/index.md new file mode 100644 index 0000000..9444ba2 --- /dev/null +++ b/palindrome-permutation/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Palindrome Permutation +date: 2015-08-24 17:21:42+08:00 +leetcode_id: 267 +--- +{% include_relative README.md %} diff --git a/partition-list/index.md b/partition-list/index.md index 348fba0..95205bb 100644 --- a/partition-list/index.md +++ b/partition-list/index.md @@ -4,6 +4,4 @@ title: Partition List date: 2014-12-29 00:26:24 +0800 leetcode_id: 86 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/pascals-triangle-ii/index.md b/pascals-triangle-ii/index.md index e7573fe..2df0e89 100644 --- a/pascals-triangle-ii/index.md +++ b/pascals-triangle-ii/index.md @@ -4,6 +4,4 @@ title: Pascal's Triangle II date: 2014-12-29 00:26:24 +0800 leetcode_id: 119 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/pascals-triangle/index.md b/pascals-triangle/index.md index c9b49ef..b4877b3 100644 --- a/pascals-triangle/index.md +++ b/pascals-triangle/index.md @@ -4,6 +4,4 @@ title: Pascal's Triangle date: 2014-12-29 00:26:24 +0800 leetcode_id: 118 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/path-sum-ii/index.md b/path-sum-ii/index.md index 1bb6614..1a725cd 100644 --- a/path-sum-ii/index.md +++ b/path-sum-ii/index.md @@ -4,6 +4,4 @@ title: Path Sum II date: 2014-12-29 00:26:24 +0800 leetcode_id: 113 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/path-sum/index.md b/path-sum/index.md index 73781f3..16491c4 100644 --- a/path-sum/index.md +++ b/path-sum/index.md @@ -4,6 +4,4 @@ title: Path Sum date: 2014-12-29 00:26:24 +0800 leetcode_id: 112 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/peeking-iterator/PeekingIterator.java b/peeking-iterator/PeekingIterator.java new file mode 120000 index 0000000..e570129 --- /dev/null +++ b/peeking-iterator/PeekingIterator.java @@ -0,0 +1 @@ +Solution.java \ No newline at end of file diff --git a/peeking-iterator/README.md b/peeking-iterator/README.md new file mode 100644 index 0000000..e69de29 diff --git a/peeking-iterator/Solution.java b/peeking-iterator/Solution.java new file mode 100644 index 0000000..e3800d2 --- /dev/null +++ b/peeking-iterator/Solution.java @@ -0,0 +1,44 @@ +// Java Iterator interface reference: +// https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html +class PeekingIterator implements Iterator { + + static final Integer NONE = new Integer(0); + + Iterator iterator; + + Integer next = NONE; + + public PeekingIterator(Iterator iterator) { + // initialize any member here. + this.iterator = iterator; + } + + // Returns the next element in the iteration without advancing the iterator. + public Integer peek() { + if(next == NONE){ + next = iterator.next(); + } + + return next; + } + + // hasNext() and next() should behave the same as in the Iterator interface. + // Override them if needed. + @Override + public Integer next() { + if(next != NONE){ + try{ + return next; + } finally { + next = NONE; + } + } + + return iterator.next(); + } + + @Override + public boolean hasNext() { + return next != NONE || iterator.hasNext(); + } +} diff --git a/peeking-iterator/index.md b/peeking-iterator/index.md new file mode 100644 index 0000000..048d659 --- /dev/null +++ b/peeking-iterator/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Peeking Iterator +date: 2015-09-24 18:02:14+08:00 +leetcode_id: 284 +--- +{% include_relative README.md %} diff --git a/permutation-sequence/index.md b/permutation-sequence/index.md index 1956c27..a5192a4 100644 --- a/permutation-sequence/index.md +++ b/permutation-sequence/index.md @@ -4,6 +4,4 @@ title: Permutation Sequence date: 2014-12-29 00:26:24 +0800 leetcode_id: 60 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/permutations-ii/index.md b/permutations-ii/index.md index c81f239..84036ab 100644 --- a/permutations-ii/index.md +++ b/permutations-ii/index.md @@ -4,6 +4,4 @@ title: Permutations II date: 2014-12-29 00:26:24 +0800 leetcode_id: 47 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/permutations/index.md b/permutations/index.md index 6b9e57c..a6708ec 100644 --- a/permutations/index.md +++ b/permutations/index.md @@ -4,6 +4,4 @@ title: Permutations date: 2014-12-29 00:26:24 +0800 leetcode_id: 46 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/plus-one/index.md b/plus-one/index.md index e04f238..102b564 100644 --- a/plus-one/index.md +++ b/plus-one/index.md @@ -4,6 +4,4 @@ title: Plus One date: 2014-12-29 00:26:24 +0800 leetcode_id: 66 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/populating-next-right-pointers-in-each-node-ii/index.md b/populating-next-right-pointers-in-each-node-ii/index.md index 262be19..f020fa6 100644 --- a/populating-next-right-pointers-in-each-node-ii/index.md +++ b/populating-next-right-pointers-in-each-node-ii/index.md @@ -4,6 +4,4 @@ title: Populating Next Right Pointers in Each Node II date: 2014-12-29 00:26:24 +0800 leetcode_id: 117 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/populating-next-right-pointers-in-each-node/index.md b/populating-next-right-pointers-in-each-node/index.md index da292c2..8b48d7a 100644 --- a/populating-next-right-pointers-in-each-node/index.md +++ b/populating-next-right-pointers-in-each-node/index.md @@ -4,6 +4,4 @@ title: Populating Next Right Pointers in Each Node date: 2014-12-29 00:26:24 +0800 leetcode_id: 116 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/power-of-two/README.md b/power-of-two/README.md new file mode 100644 index 0000000..e69de29 diff --git a/power-of-two/Solution.java b/power-of-two/Solution.java new file mode 100644 index 0000000..9a4aae2 --- /dev/null +++ b/power-of-two/Solution.java @@ -0,0 +1,10 @@ +public class Solution { + public boolean isPowerOfTwo(int n) { + if(n == 0) return false; + if(n == 1) return true; + + if(n % 2 == 1) return false; + + return isPowerOfTwo(n / 2); + } +} diff --git a/power-of-two/index.md b/power-of-two/index.md new file mode 100644 index 0000000..de9ef4b --- /dev/null +++ b/power-of-two/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Power of Two +date: 2015-07-06 23:00:26+08:00 +leetcode_id: 231 +--- +{% include_relative README.md %} diff --git a/powx-n/Solution.java b/powx-n/Solution.java index f8e8026..d70d1b2 100644 --- a/powx-n/Solution.java +++ b/powx-n/Solution.java @@ -1,17 +1,14 @@ public class Solution { - public double pow(double x, int n) { - // Note: The Solution object is instantiated only once and is reused by each test case. - if(n == 0) return 1; + public double myPow(double x, int n) { - double s = pow(x, n /2); + if(n == 0) return 1; - if(n % 2 == 0) - return s * s; - else if(n > 0) - return s * s * x; - else - return s * s / x; + double s = myPow(x, n / 2); + if(n % 2 == 0) return s * s; + if(n > 0) return s * s * x; + // else n < 0 + return s * s / x; } } diff --git a/powx-n/index.md b/powx-n/index.md index 3abcfb9..efe0fd2 100644 --- a/powx-n/index.md +++ b/powx-n/index.md @@ -1,9 +1,7 @@ --- layout: solution title: Pow(x, n) -date: 2014-12-29 00:26:24 +0800 +date: 2015-05-09 22:51:01 +0800 leetcode_id: 50 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/product-of-array-except-self/README.md b/product-of-array-except-self/README.md new file mode 100644 index 0000000..e69de29 diff --git a/product-of-array-except-self/Solution.java b/product-of-array-except-self/Solution.java new file mode 100644 index 0000000..6a04e4a --- /dev/null +++ b/product-of-array-except-self/Solution.java @@ -0,0 +1,25 @@ +public class Solution { + public int[] productExceptSelf(int[] nums) { + int[] output = new int[nums.length]; + + if(nums.length == 0) return output; + + output[0] = nums[0]; + + for(int i = 1; i < nums.length; i++){ + output[i] = output[i - 1] * nums[i]; + } + + output[nums.length - 1] = output[nums.length - 2] * 1; + + int t = nums[nums.length - 1]; + for(int i = output.length - 2; i > 0 ; i--){ + output[i] = t * output[i - 1]; + t *= nums[i]; + } + + output[0] = t; + + return output; + } +} diff --git a/product-of-array-except-self/index.md b/product-of-array-except-self/index.md new file mode 100644 index 0000000..f20523b --- /dev/null +++ b/product-of-array-except-self/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Product of Array Except Self +date: 2015-07-26 17:23:07+08:00 +leetcode_id: 238 +--- +{% include_relative README.md %} diff --git a/read-n-characters-given-read4-ii-call-multiple-times/index.md b/read-n-characters-given-read4-ii-call-multiple-times/index.md index cc2df63..52a6c51 100644 --- a/read-n-characters-given-read4-ii-call-multiple-times/index.md +++ b/read-n-characters-given-read4-ii-call-multiple-times/index.md @@ -4,6 +4,4 @@ title: Read N Characters Given Read4 II - Call multiple times date: 2014-12-29 00:26:24 +0800 leetcode_id: 158 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/read-n-characters-given-read4/index.md b/read-n-characters-given-read4/index.md index 19a4f5e..111133f 100644 --- a/read-n-characters-given-read4/index.md +++ b/read-n-characters-given-read4/index.md @@ -4,6 +4,4 @@ title: Read N Characters Given Read4 date: 2014-12-29 00:26:24 +0800 leetcode_id: 157 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/recover-binary-search-tree/index.md b/recover-binary-search-tree/index.md index 52ba332..3025e4c 100644 --- a/recover-binary-search-tree/index.md +++ b/recover-binary-search-tree/index.md @@ -4,6 +4,4 @@ title: Recover Binary Search Tree date: 2014-12-29 00:26:24 +0800 leetcode_id: 99 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/rectangle-area/README.md b/rectangle-area/README.md new file mode 100644 index 0000000..e69de29 diff --git a/rectangle-area/Solution.java b/rectangle-area/Solution.java new file mode 100644 index 0000000..d26cfec --- /dev/null +++ b/rectangle-area/Solution.java @@ -0,0 +1,35 @@ +public class Solution { + + int area(int x1, int y1, int x2, int y2){ + return (y2 - y1) * (x2 - x1); + } + + public int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) { + + // make sure left is left + if(A > E){ + return computeArea(E, F, G, H, A, B, C, D); + } + + int a = area(A, B, C, D) + area(E, F, G, H); + + // no share case1 + // [ ]C + // E[ ] + if(C < E){ + return a; + } + + // no share case2 + // [ ]B + // + // [ ]H + + if(B > H || F > D){ + return a; + } + + // remove share + return a - area(E, Math.max(B, F), Math.min(C, G), Math.min(D, H)); + } +} diff --git a/rectangle-area/index.md b/rectangle-area/index.md new file mode 100644 index 0000000..3303cd1 --- /dev/null +++ b/rectangle-area/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Rectangle Area +date: 2015-06-08 23:32:33+08:00 +leetcode_id: 223 +--- +{% include_relative README.md %} diff --git a/regular-expression-matching/index.md b/regular-expression-matching/index.md index 309dc29..3a07abc 100644 --- a/regular-expression-matching/index.md +++ b/regular-expression-matching/index.md @@ -4,6 +4,4 @@ title: Regular Expression Matching date: 2014-12-29 00:26:24 +0800 leetcode_id: 10 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/remove-duplicates-from-sorted-array-ii/index.md b/remove-duplicates-from-sorted-array-ii/index.md index e1f66e9..6150623 100644 --- a/remove-duplicates-from-sorted-array-ii/index.md +++ b/remove-duplicates-from-sorted-array-ii/index.md @@ -4,6 +4,4 @@ title: Remove Duplicates from Sorted Array II date: 2014-12-29 00:26:24 +0800 leetcode_id: 80 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/remove-duplicates-from-sorted-array/index.md b/remove-duplicates-from-sorted-array/index.md index 4393d88..e09cbc4 100644 --- a/remove-duplicates-from-sorted-array/index.md +++ b/remove-duplicates-from-sorted-array/index.md @@ -4,6 +4,4 @@ title: Remove Duplicates from Sorted Array date: 2014-12-29 00:26:24 +0800 leetcode_id: 26 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/remove-duplicates-from-sorted-list-ii/index.md b/remove-duplicates-from-sorted-list-ii/index.md index 4d64ac1..0356ee4 100644 --- a/remove-duplicates-from-sorted-list-ii/index.md +++ b/remove-duplicates-from-sorted-list-ii/index.md @@ -4,6 +4,4 @@ title: Remove Duplicates from Sorted List II date: 2014-12-29 00:26:24 +0800 leetcode_id: 82 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/remove-duplicates-from-sorted-list/index.md b/remove-duplicates-from-sorted-list/index.md index dbe930c..58728b3 100644 --- a/remove-duplicates-from-sorted-list/index.md +++ b/remove-duplicates-from-sorted-list/index.md @@ -4,6 +4,4 @@ title: Remove Duplicates from Sorted List date: 2014-12-29 00:26:24 +0800 leetcode_id: 83 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/remove-element/index.md b/remove-element/index.md index e868ba8..1a5ba21 100644 --- a/remove-element/index.md +++ b/remove-element/index.md @@ -4,6 +4,4 @@ title: Remove Element date: 2014-12-29 00:26:24 +0800 leetcode_id: 27 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/remove-linked-list-elements/README.md b/remove-linked-list-elements/README.md new file mode 100644 index 0000000..e69de29 diff --git a/remove-linked-list-elements/Solution.java b/remove-linked-list-elements/Solution.java new file mode 100644 index 0000000..c106a1e --- /dev/null +++ b/remove-linked-list-elements/Solution.java @@ -0,0 +1,20 @@ +/** + * Definition for singly-linked list. + * public class ListNode { + * int val; + * ListNode next; + * ListNode(int x) { val = x; } + * } + */ +public class Solution { + public ListNode removeElements(ListNode head, int val) { + + if(head == null) return null; + + if(head.val == val) return removeElements(head.next, val); + + head.next = removeElements(head.next, val); + + return head; + } +} diff --git a/remove-linked-list-elements/index.md b/remove-linked-list-elements/index.md new file mode 100644 index 0000000..b594a2f --- /dev/null +++ b/remove-linked-list-elements/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Remove Linked List Elements +date: 2015-04-23 11:39:56 +0800 +leetcode_id: 203 +--- +{% include_relative README.md %} diff --git a/remove-nth-node-from-end-of-list/index.md b/remove-nth-node-from-end-of-list/index.md index fb3fa2e..d604ea1 100644 --- a/remove-nth-node-from-end-of-list/index.md +++ b/remove-nth-node-from-end-of-list/index.md @@ -4,6 +4,4 @@ title: Remove Nth Node From End of List date: 2014-12-29 00:26:24 +0800 leetcode_id: 19 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/reorder-list/README.md b/reorder-list/README.md index deade0e..8230038 100644 --- a/reorder-list/README.md +++ b/reorder-list/README.md @@ -8,7 +8,7 @@ reorder can be achieved via ## Some O(n) method to deal with a linked list -### Reverse a linked list +### [Reverse a linked list](../reverse-linked-list) 1. walk through the linked list 1. set `node.next` to `prev` diff --git a/reorder-list/index.md b/reorder-list/index.md index 0d40da5..9128272 100644 --- a/reorder-list/index.md +++ b/reorder-list/index.md @@ -1,9 +1,7 @@ --- layout: solution title: Reorder List -date: 2014-12-29 00:26:24 +0800 +date: 2015-05-05 11:59:41 +0800 leetcode_id: 143 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/repeated-dna-sequences/index.md b/repeated-dna-sequences/index.md index dc814f3..5e6ae50 100644 --- a/repeated-dna-sequences/index.md +++ b/repeated-dna-sequences/index.md @@ -4,6 +4,4 @@ title: Repeated DNA Sequences date: 2015-03-08 01:16:06 +0800 leetcode_id: 187 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/restore-ip-addresses/Solution.java b/restore-ip-addresses/Solution.java index 97f46f4..9c766c3 100644 --- a/restore-ip-addresses/Solution.java +++ b/restore-ip-addresses/Solution.java @@ -9,7 +9,7 @@ void findnum(String s, int p, int pstack){ if(pstack == 4){ if(p >= s.length()){ - String ip = "" + stack[0] + "." + stack[1] + "." + stack[2] + "." + stack[3]; + String ip = String.join(".", stack); collect.add(ip); } diff --git a/restore-ip-addresses/index.md b/restore-ip-addresses/index.md index 36710a2..b5fb755 100644 --- a/restore-ip-addresses/index.md +++ b/restore-ip-addresses/index.md @@ -1,9 +1,7 @@ --- layout: solution title: Restore IP Addresses -date: 2014-12-29 00:26:24 +0800 +date: 2015-05-10 01:51:44 +0800 leetcode_id: 93 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/reverse-bits/index.md b/reverse-bits/index.md index e5ef1de..bfffd23 100644 --- a/reverse-bits/index.md +++ b/reverse-bits/index.md @@ -4,6 +4,4 @@ title: Reverse Bits date: 2015-03-07 19:36:21 +0800 leetcode_id: 190 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/reverse-integer/index.md b/reverse-integer/index.md index 813d566..e47927f 100644 --- a/reverse-integer/index.md +++ b/reverse-integer/index.md @@ -4,6 +4,4 @@ title: Reverse Integer date: 2015-01-18 03:14:54 +0800 leetcode_id: 7 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/reverse-linked-list-ii/index.md b/reverse-linked-list-ii/index.md index d65f42e..2245e9a 100644 --- a/reverse-linked-list-ii/index.md +++ b/reverse-linked-list-ii/index.md @@ -4,6 +4,4 @@ title: Reverse Linked List II date: 2014-12-29 00:26:24 +0800 leetcode_id: 92 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/reverse-linked-list/README.md b/reverse-linked-list/README.md new file mode 100644 index 0000000..e69de29 diff --git a/reverse-linked-list/Solution.java b/reverse-linked-list/Solution.java new file mode 100644 index 0000000..91aba69 --- /dev/null +++ b/reverse-linked-list/Solution.java @@ -0,0 +1,24 @@ +/** + * Definition for singly-linked list. + * public class ListNode { + * int val; + * ListNode next; + * ListNode(int x) { val = x; } + * } + */ +public class Solution { + public ListNode reverseList(ListNode head) { + + if(head == null) return null; + if(head.next == null) return head; + + ListNode tail = head.next; + ListNode reversed = reverseList(head.next); + + tail.next = head; + + head.next = null; + + return reversed; + } +} diff --git a/reverse-linked-list/index.md b/reverse-linked-list/index.md new file mode 100644 index 0000000..865563e --- /dev/null +++ b/reverse-linked-list/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Reverse Linked List +date: 2015-05-05 11:48:40 +0800 +leetcode_id: 206 +--- +{% include_relative README.md %} diff --git a/reverse-nodes-in-k-group/Solution.java b/reverse-nodes-in-k-group/Solution.java index 739b608..99bdc69 100644 --- a/reverse-nodes-in-k-group/Solution.java +++ b/reverse-nodes-in-k-group/Solution.java @@ -3,55 +3,53 @@ * public class ListNode { * int val; * ListNode next; - * ListNode(int x) { - * val = x; - * next = null; - * } + * ListNode(int x) { val = x; } * } */ public class Solution { + + ListNode reverse(ListNode head) { + + ListNode prev = null; + + while(head != null){ + ListNode t = head.next; + + head.next = prev; + prev = head; + + head = t; + } + + return prev; + } + public ListNode reverseKGroup(ListNode head, int k) { - // IMPORTANT: Please reset any member data you declared, as - // the same Solution instance will be reused for each test case. if(k <= 1) return head; - if(head == null) return null; if(head.next == null) return head; ListNode tail = head; - ListNode prev = null; - for(int i = 0; i < k ; i++){ - if(head == null){ - - // rollback - head = prev; - prev = null; - - while(head != null){ - ListNode t = head.next; - - head.next = prev; - prev = head; - - head = t; - } - - return prev; - } - - ListNode t = head.next; - - head.next = prev; - prev = head; - - head = t; + for(int i = 1; i < k && tail != null; i++){ + tail = tail.next; } - tail.next = reverseKGroup(head, k); + if (tail == null) { + // less than k nodes + return head; + } - return prev; + ListNode next = tail.next; + tail.next = null; // cut + + tail = head; // head will be new tail + head = reverse(head); + + tail.next = reverseKGroup(next, k); + + return head; } -} \ No newline at end of file +} diff --git a/reverse-nodes-in-k-group/index.md b/reverse-nodes-in-k-group/index.md index b034ef5..d7e686d 100644 --- a/reverse-nodes-in-k-group/index.md +++ b/reverse-nodes-in-k-group/index.md @@ -1,9 +1,7 @@ --- layout: solution title: Reverse Nodes in k-Group -date: 2014-12-29 00:26:24 +0800 +date: 2015-05-09 02:43:34 +0800 leetcode_id: 25 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/reverse-words-in-a-string-ii/index.md b/reverse-words-in-a-string-ii/index.md index 55be95a..b13b207 100644 --- a/reverse-words-in-a-string-ii/index.md +++ b/reverse-words-in-a-string-ii/index.md @@ -4,6 +4,4 @@ title: Reverse Words in a String II date: 2015-02-03 14:42:33 +0800 leetcode_id: 186 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/reverse-words-in-a-string/index.md b/reverse-words-in-a-string/index.md index 88bd05e..b6aab81 100644 --- a/reverse-words-in-a-string/index.md +++ b/reverse-words-in-a-string/index.md @@ -4,6 +4,4 @@ title: Reverse Words in a String date: 2015-01-19 00:08:01 +0800 leetcode_id: 151 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/roman-to-integer/index.md b/roman-to-integer/index.md index d99b286..3076c43 100644 --- a/roman-to-integer/index.md +++ b/roman-to-integer/index.md @@ -4,6 +4,4 @@ title: Roman to Integer date: 2014-12-29 00:26:24 +0800 leetcode_id: 13 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/rotate-array/index.md b/rotate-array/index.md index fd5a686..85eeb33 100644 --- a/rotate-array/index.md +++ b/rotate-array/index.md @@ -4,6 +4,4 @@ title: Rotate Array date: 2015-03-04 01:39:57 +0800 leetcode_id: 189 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/rotate-image/index.md b/rotate-image/index.md index f8a2719..7fcfdce 100644 --- a/rotate-image/index.md +++ b/rotate-image/index.md @@ -4,6 +4,4 @@ title: Rotate Image date: 2014-12-29 00:26:24 +0800 leetcode_id: 48 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/rotate-list/Solution.java b/rotate-list/Solution.java index efb2005..e978209 100644 --- a/rotate-list/Solution.java +++ b/rotate-list/Solution.java @@ -3,39 +3,36 @@ * public class ListNode { * int val; * ListNode next; - * ListNode(int x) { - * val = x; - * next = null; - * } + * ListNode(int x) { val = x; } * } */ public class Solution { - public ListNode rotateRight(ListNode head, int n) { - // Note: The Solution object is instantiated only once and is reused by each test case. + public ListNode rotateRight(ListNode head, int k) { if(head == null) return null; - ListNode _head = head; - - ListNode node = head; int len = 1; - while(node.next != null){ + + ListNode tail = head; + + while(tail.next != null){ len++; - node = node.next; + tail = tail.next; } - n %= len; - - ListNode tail = node; + tail.next = head; // cycle - node = head; - for(int i = 0; i < len - n - 1; i++) node = node.next; + k %= len; - tail.next = head; - ListNode rt = node.next; - node.next = null; + for(int i = 1; i < len - k; i++){ + head = head.next; + } - return rt; + try { + return head.next; + } finally { + head.next = null; // cut + } } -} \ No newline at end of file +} diff --git a/rotate-list/index.md b/rotate-list/index.md index 45258b7..c9539f8 100644 --- a/rotate-list/index.md +++ b/rotate-list/index.md @@ -1,9 +1,7 @@ --- layout: solution title: Rotate List -date: 2014-12-29 00:26:24 +0800 +date: 2015-05-10 00:33:24 +0800 leetcode_id: 61 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/same-tree/index.md b/same-tree/index.md index b782b27..1c0024b 100644 --- a/same-tree/index.md +++ b/same-tree/index.md @@ -4,6 +4,4 @@ title: Same Tree date: 2014-12-29 00:26:24 +0800 leetcode_id: 100 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/scramble-string/README.md b/scramble-string/README.md index 8a42161..e7fe5bc 100644 --- a/scramble-string/README.md +++ b/scramble-string/README.md @@ -54,6 +54,8 @@ that means we can make a filter to remove all `set` must not take `0` as its fir and `1` as it second and so on... so we build a methd + + ``` check_has_char(pos, letter, two_part_set) set = pos -> left_set or right_set depends on the two_part_set pivot diff --git a/scramble-string/index.md b/scramble-string/index.md index d53fff5..d377ad4 100644 --- a/scramble-string/index.md +++ b/scramble-string/index.md @@ -1,9 +1,7 @@ --- layout: solution title: Scramble String -date: 2014-12-29 00:26:24 +0800 +date: 2015-05-10 01:38:41 +0800 leetcode_id: 87 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/search-a-2d-matrix-ii/README.md b/search-a-2d-matrix-ii/README.md new file mode 100644 index 0000000..e69de29 diff --git a/search-a-2d-matrix-ii/Solution.java b/search-a-2d-matrix-ii/Solution.java new file mode 100644 index 0000000..dbd55ab --- /dev/null +++ b/search-a-2d-matrix-ii/Solution.java @@ -0,0 +1,32 @@ +public class Solution { + + boolean searchMatrix(int[][] matrix, int stX, int stY, int edX, int edY, int target) { + + if (stX >= edX || stY >= edY) return false; + + int max = matrix[edX - 1][edY - 1]; + int min = matrix[stX][stY]; + + // min <= target <= max + if (min <= target && target <= max){ + + int mdX = (stX + edX) / 2; + int mdY = (stY + edY) / 2; + + if(matrix[mdX][mdY] == target){ + return true; + } + + return searchMatrix(matrix, stX, stY, mdX, mdY, target) || + searchMatrix(matrix, stX, mdY, mdX, edY, target) || + searchMatrix(matrix, mdX, stY, edX, mdY, target) || + searchMatrix(matrix, mdX, mdY, edX, edY, target); + } + + return false; + } + + public boolean searchMatrix(int[][] matrix, int target) { + return searchMatrix(matrix, 0, 0, matrix.length, matrix[0].length, target); + } +} diff --git a/search-a-2d-matrix-ii/index.md b/search-a-2d-matrix-ii/index.md new file mode 100644 index 0000000..c67abeb --- /dev/null +++ b/search-a-2d-matrix-ii/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Search a 2D Matrix II +date: 2015-07-26 14:40:48+08:00 +leetcode_id: 240 +--- +{% include_relative README.md %} diff --git a/search-a-2d-matrix/index.md b/search-a-2d-matrix/index.md index daf935f..20286a4 100644 --- a/search-a-2d-matrix/index.md +++ b/search-a-2d-matrix/index.md @@ -4,6 +4,4 @@ title: Search a 2D Matrix date: 2014-12-29 00:26:24 +0800 leetcode_id: 74 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/search-for-a-range/index.md b/search-for-a-range/index.md index dd9c71b..b60cba3 100644 --- a/search-for-a-range/index.md +++ b/search-for-a-range/index.md @@ -4,6 +4,4 @@ title: Search for a Range date: 2014-12-29 00:26:24 +0800 leetcode_id: 34 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/search-in-rotated-sorted-array-ii/index.md b/search-in-rotated-sorted-array-ii/index.md index 8139bb6..81594de 100644 --- a/search-in-rotated-sorted-array-ii/index.md +++ b/search-in-rotated-sorted-array-ii/index.md @@ -4,6 +4,4 @@ title: Search in Rotated Sorted Array II date: 2014-12-29 00:26:24 +0800 leetcode_id: 81 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/search-in-rotated-sorted-array/index.md b/search-in-rotated-sorted-array/index.md index 2215282..6167729 100644 --- a/search-in-rotated-sorted-array/index.md +++ b/search-in-rotated-sorted-array/index.md @@ -4,6 +4,4 @@ title: Search in Rotated Sorted Array date: 2014-12-29 00:26:24 +0800 leetcode_id: 33 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/search-insert-position/index.md b/search-insert-position/index.md index 303314f..ec3700e 100644 --- a/search-insert-position/index.md +++ b/search-insert-position/index.md @@ -4,6 +4,4 @@ title: Search Insert Position date: 2014-12-29 00:26:24 +0800 leetcode_id: 35 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/set-matrix-zeroes/index.md b/set-matrix-zeroes/index.md index ab5f6ca..7e0f220 100644 --- a/set-matrix-zeroes/index.md +++ b/set-matrix-zeroes/index.md @@ -4,6 +4,4 @@ title: Set Matrix Zeroes date: 2014-12-29 00:26:24 +0800 leetcode_id: 73 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/shortest-palindrome/README.md b/shortest-palindrome/README.md new file mode 100644 index 0000000..e69de29 diff --git a/shortest-palindrome/Solution.java b/shortest-palindrome/Solution.java new file mode 100644 index 0000000..74f385a --- /dev/null +++ b/shortest-palindrome/Solution.java @@ -0,0 +1,50 @@ +public class Solution { + public String shortestPalindrome(String s) { + char[] S = s.toCharArray(); + + int[] P = new int[S.length]; + + for(int i = S.length - 2; i >= 0; i--){ + if(S[i] == S[i + 1]){ + P[i] = P[i + 1] + 1; + } + } + + int i = 0; + int e = S.length - 1; + + int j = e; + + while(i < j){ + + if(S[i] == S[j]){ + + i++; + j--; + + } else { + + if(P[j] >= i){ + j--; + e--; + + } else if(i > 0) { + + i = 0; + e = j; + + } else { + + j = e - 1; + e--; + } + } + } + + StringBuilder sb = new StringBuilder(new String(S, e + 1, S.length - e - 1)).reverse(); + + sb.append(s); + + return sb.toString(); + } +} diff --git a/shortest-palindrome/index.md b/shortest-palindrome/index.md new file mode 100644 index 0000000..aa04491 --- /dev/null +++ b/shortest-palindrome/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Shortest Palindrome +date: 2015-05-26 01:19:56+08:00 +leetcode_id: 214 +--- +{% include_relative README.md %} diff --git a/shortest-word-distance/README.md b/shortest-word-distance/README.md new file mode 100644 index 0000000..e69de29 diff --git a/shortest-word-distance/Solution.java b/shortest-word-distance/Solution.java new file mode 100644 index 0000000..2510f2e --- /dev/null +++ b/shortest-word-distance/Solution.java @@ -0,0 +1,23 @@ +public class Solution { + public int shortestDistance(String[] words, String word1, String word2) { + + int len = words.length; + + int i1 = -1; + int i2 = -1; + + for(int i = 0; i < words.length; i++){ + if(word1.equals(words[i])){ + i1 = i; + }else if(word2.equals(words[i])){ + i2 = i; + } + + if(i1 >= 0 && i2 >= 0){ + len = Math.min(len, Math.abs(i1 - i2)); + } + } + + return len; + } +} diff --git a/shortest-word-distance/index.md b/shortest-word-distance/index.md new file mode 100644 index 0000000..93c70ba --- /dev/null +++ b/shortest-word-distance/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Shortest Word Distance +date: 2015-08-17 01:11:54+08:00 +leetcode_id: 243 +--- +{% include_relative README.md %} diff --git a/simplify-path/index.md b/simplify-path/index.md index cd0d98a..924e27c 100644 --- a/simplify-path/index.md +++ b/simplify-path/index.md @@ -4,6 +4,4 @@ title: Simplify Path date: 2015-01-29 15:17:38 +0800 leetcode_id: 71 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/single-number-ii/index.md b/single-number-ii/index.md index 49a8ae8..b8d1972 100644 --- a/single-number-ii/index.md +++ b/single-number-ii/index.md @@ -4,6 +4,4 @@ title: Single Number II date: 2014-12-29 00:26:24 +0800 leetcode_id: 137 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/single-number-iii/README.md b/single-number-iii/README.md new file mode 100644 index 0000000..e69de29 diff --git a/single-number-iii/Solution.java b/single-number-iii/Solution.java new file mode 100644 index 0000000..0d6ea7e --- /dev/null +++ b/single-number-iii/Solution.java @@ -0,0 +1,21 @@ +public class Solution { + public int[] singleNumber(int[] nums) { + int aXORb = nums[0]; + + for(int i = 1; i < nums.length; i++){ + aXORb ^= nums[i]; + } + + // this bit either in a or b + int bit = Integer.lowestOneBit(aXORb); + + int a = 0; + for(int n : nums){ + if((n & bit) == bit){ + a ^= n; + } + } + + return new int[]{a, aXORb ^ a}; + } +} diff --git a/single-number-iii/index.md b/single-number-iii/index.md new file mode 100644 index 0000000..669d318 --- /dev/null +++ b/single-number-iii/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Single Number III +date: 2015-08-25 00:56:56+08:00 +leetcode_id: 260 +--- +{% include_relative README.md %} diff --git a/single-number/index.md b/single-number/index.md index 8f9175d..d639686 100644 --- a/single-number/index.md +++ b/single-number/index.md @@ -4,6 +4,4 @@ title: Single Number date: 2014-12-29 00:26:24 +0800 leetcode_id: 136 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/skeleton.sh b/skeleton.sh index c249e26..54a550e 100755 --- a/skeleton.sh +++ b/skeleton.sh @@ -7,6 +7,16 @@ if [ -z "$leetcode_name" ]; then exit; fi +info=`curl -s https://leetcode.com/problemset/algorithms/ | grep /$leetcode_name/ -B 2` +IFS= +leetcode_id=`(sed 's/\\(.*\\)<\\/td>/\\1/' | sed 's/^ *//') < <(echo $info | head -n 1)` +title=`(sed 's/\\(.*\\)<\\/a>/\\1/' | sed 's/^ *//') < <(echo $info | tail -n 1)` + +if [ -z "$leetcode_id" ]; then + echo "cant fetch leetcode_id for $leetcode_name" + exit +fi + now=`date --rfc-3339=seconds` mkdir -p $leetcode_name @@ -16,13 +26,11 @@ mkdir -p $leetcode_name cat > $leetcode_name/index.md < queue = new LinkedList<>(); + + SlidingMaxQueue(int[] nums, int k){ + this.nums = nums; + this.k = k; + } + + int max(){ + return nums[queue.peekFirst()]; + } + + void add(int i){ + + if(i >= nums.length) return; + + // remove invalid index + while(!queue.isEmpty() && queue.peekFirst() <= i - k){ + queue.pollFirst(); + } + + // remove nums < current; + while(!queue.isEmpty() && nums[queue.peekLast()] < nums[i]){ + queue.pollLast(); + } + + queue.add(i); + } + } + + public int[] maxSlidingWindow(int[] nums, int k) { + + int[] T = new int[Math.min(nums.length - k + 1, nums.length)]; + + SlidingMaxQueue Q = new SlidingMaxQueue(nums, k); + + Q.add(0); + + for(int i = 1; i <= nums.length; i++){ + T[Math.max(i - k, 0)] = Q.max(); + Q.add(i); + } + + return T; + } +} diff --git a/sliding-window-maximum/index.md b/sliding-window-maximum/index.md new file mode 100644 index 0000000..bdcd880 --- /dev/null +++ b/sliding-window-maximum/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Sliding Window Maximum +date: 2015-07-26 16:53:20+08:00 +leetcode_id: 239 +--- +{% include_relative README.md %} diff --git a/sort-colors/index.md b/sort-colors/index.md index 81eaad5..ea77fbb 100644 --- a/sort-colors/index.md +++ b/sort-colors/index.md @@ -4,6 +4,4 @@ title: Sort Colors date: 2015-01-22 01:52:46 +0800 leetcode_id: 75 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/sort-list/index.md b/sort-list/index.md index f6ac98d..9dcd802 100644 --- a/sort-list/index.md +++ b/sort-list/index.md @@ -4,6 +4,4 @@ title: Sort List date: 2014-12-29 00:26:24 +0800 leetcode_id: 148 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/spiral-matrix-ii/index.md b/spiral-matrix-ii/index.md index fa9813a..e624bf8 100644 --- a/spiral-matrix-ii/index.md +++ b/spiral-matrix-ii/index.md @@ -4,6 +4,4 @@ title: Spiral Matrix II date: 2014-12-29 00:26:24 +0800 leetcode_id: 59 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/spiral-matrix/index.md b/spiral-matrix/index.md index 99c8006..e68647e 100644 --- a/spiral-matrix/index.md +++ b/spiral-matrix/index.md @@ -4,6 +4,4 @@ title: Spiral Matrix date: 2014-12-29 00:26:24 +0800 leetcode_id: 54 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/sqrtx/index.md b/sqrtx/index.md index 31cc78c..909dcc2 100644 --- a/sqrtx/index.md +++ b/sqrtx/index.md @@ -4,6 +4,4 @@ title: Sqrt(x) date: 2015-01-18 23:48:07 +0800 leetcode_id: 69 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/string-to-integer-atoi/index.md b/string-to-integer-atoi/index.md index 70484c6..3304230 100644 --- a/string-to-integer-atoi/index.md +++ b/string-to-integer-atoi/index.md @@ -4,6 +4,4 @@ title: String to Integer (atoi) date: 2014-12-29 00:26:24 +0800 leetcode_id: 8 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/strobogrammatic-number/README.md b/strobogrammatic-number/README.md new file mode 100644 index 0000000..e69de29 diff --git a/strobogrammatic-number/Solution.java b/strobogrammatic-number/Solution.java new file mode 100644 index 0000000..b3fea63 --- /dev/null +++ b/strobogrammatic-number/Solution.java @@ -0,0 +1,33 @@ +public class Solution { + + static final char[][] GOOD_PATTERNS = { + {'9', '6'}, + {'6', '9'}, + {'1', '1'}, + {'8', '8'}, + {'0', '0'}, + }; + + boolean isStrobogrammatic(char l, char r){ + char[] s = new char[]{l, r}; + + for(char[] g : GOOD_PATTERNS){ + if(Arrays.equals(g, s)){ + return true; + } + } + return false; + } + + public boolean isStrobogrammatic(String num) { + char[] S = num.toCharArray(); + + for(int i = 0; i <= S.length / 2; i++){ + if(!isStrobogrammatic(S[i], S[S.length - 1 - i])){ + return false; + } + } + + return true; + } +} diff --git a/strobogrammatic-number/index.md b/strobogrammatic-number/index.md new file mode 100644 index 0000000..36a151a --- /dev/null +++ b/strobogrammatic-number/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Strobogrammatic Number +date: 2015-08-06 22:24:30+08:00 +leetcode_id: 246 +--- +{% include_relative README.md %} diff --git a/subsets-ii/index.md b/subsets-ii/index.md index a8e086a..d3de772 100644 --- a/subsets-ii/index.md +++ b/subsets-ii/index.md @@ -4,6 +4,4 @@ title: Subsets II date: 2015-02-13 01:14:40 +0800 leetcode_id: 90 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/subsets/index.md b/subsets/index.md index e7401c2..4264933 100644 --- a/subsets/index.md +++ b/subsets/index.md @@ -4,6 +4,4 @@ title: Subsets date: 2015-02-13 01:10:10 +0800 leetcode_id: 78 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/substring-with-concatenation-of-all-words/index.md b/substring-with-concatenation-of-all-words/index.md index 3827ff6..54e5fe3 100644 --- a/substring-with-concatenation-of-all-words/index.md +++ b/substring-with-concatenation-of-all-words/index.md @@ -4,6 +4,4 @@ title: Substring with Concatenation of All Words date: 2014-12-29 00:26:24 +0800 leetcode_id: 30 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/sudoku-solver/index.md b/sudoku-solver/index.md index 533f205..4953517 100644 --- a/sudoku-solver/index.md +++ b/sudoku-solver/index.md @@ -4,6 +4,4 @@ title: Sudoku Solver date: 2014-12-29 00:26:24 +0800 leetcode_id: 37 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/sum-root-to-leaf-numbers/index.md b/sum-root-to-leaf-numbers/index.md index ebd2a0f..ed920b0 100644 --- a/sum-root-to-leaf-numbers/index.md +++ b/sum-root-to-leaf-numbers/index.md @@ -4,6 +4,4 @@ title: Sum Root to Leaf Numbers date: 2015-01-16 16:07:02 -0500 leetcode_id: 129 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/summary-ranges/README.md b/summary-ranges/README.md new file mode 100644 index 0000000..e69de29 diff --git a/summary-ranges/Solution.java b/summary-ranges/Solution.java new file mode 100644 index 0000000..f37335b --- /dev/null +++ b/summary-ranges/Solution.java @@ -0,0 +1,41 @@ +public class Solution { + + static class Range { + + int st; + int ed; + + Range(int st){ + this.st = st; + this.ed = st; + } + + public String toString(){ + if(ed == st) return "" + st; + + return st + "->" + ed; + } + } + + public List summaryRanges(int[] nums) { + + ArrayList rt = new ArrayList<>(); + + if(nums.length == 0) return rt; + + Range r = new Range(nums[0]); + + for(int i = 1; i < nums.length; i++){ + if(nums[i] - r.ed == 1){ + r.ed = nums[i]; + } else { + rt.add(r.toString()); + r = new Range(nums[i]); + } + } + + rt.add(r.toString()); + + return rt; + } +} diff --git a/summary-ranges/index.md b/summary-ranges/index.md new file mode 100644 index 0000000..6fb65ed --- /dev/null +++ b/summary-ranges/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Summary Ranges +date: 2015-06-28 15:35:53+08:00 +leetcode_id: 228 +--- +{% include_relative README.md %} diff --git a/surrounded-regions/index.md b/surrounded-regions/index.md index 0cabbe2..7e48167 100644 --- a/surrounded-regions/index.md +++ b/surrounded-regions/index.md @@ -4,6 +4,4 @@ title: Surrounded Regions date: 2014-12-29 00:26:24 +0800 leetcode_id: 130 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/swap-nodes-in-pairs/index.md b/swap-nodes-in-pairs/index.md index 409f48c..dcbf2db 100644 --- a/swap-nodes-in-pairs/index.md +++ b/swap-nodes-in-pairs/index.md @@ -4,6 +4,4 @@ title: Swap Nodes in Pairs date: 2014-12-29 00:26:24 +0800 leetcode_id: 24 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/symmetric-tree/index.md b/symmetric-tree/index.md index cbce220..bde57f8 100644 --- a/symmetric-tree/index.md +++ b/symmetric-tree/index.md @@ -4,6 +4,4 @@ title: Symmetric Tree date: 2014-12-29 00:26:24 +0800 leetcode_id: 101 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/text-justification/index.md b/text-justification/index.md index 11f1826..2990eb3 100644 --- a/text-justification/index.md +++ b/text-justification/index.md @@ -4,6 +4,4 @@ title: Text Justification date: 2014-12-29 00:26:24 +0800 leetcode_id: 68 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/the-skyline-problem/README.md b/the-skyline-problem/README.md new file mode 100644 index 0000000..e69de29 diff --git a/the-skyline-problem/Solution.java b/the-skyline-problem/Solution.java new file mode 100644 index 0000000..ff2b372 --- /dev/null +++ b/the-skyline-problem/Solution.java @@ -0,0 +1,124 @@ +public class Solution { + static int li(int[] building){ + return building[0]; + } + + static int ri(int[] building){ + return building[1]; + } + + static int hi(int[] building){ + return building[2]; + } + + static class SortedBuilds { + int[][] buildings; + int p = 0; + + PriorityQueue inserted = new PriorityQueue<>((a, b) -> li(a) - li(b)); + + SortedBuilds(int[][] buildings) { + this.buildings = buildings; + } + + boolean hasNext(){ + return p < buildings.length || !inserted.isEmpty(); + } + + + int[] next(){ + + if(p < buildings.length && !inserted.isEmpty()){ + + if(li(buildings[p]) < li(inserted.peek())){ + return buildings[p++]; + }else{ + return inserted.poll(); + } + + } else if(p < buildings.length ){ + return buildings[p++]; + } else { // !inserted.isEmpty()) + return inserted.poll(); + } + + } + + void insert(int[] building){ + inserted.add(building); + } + } + + public List getSkyline(int[][] buildings) { + + List all = new ArrayList<>(); + if(buildings.length == 0) return all; + + SortedBuilds sortedBuilds = new SortedBuilds(buildings); + + int[] a = sortedBuilds.next(); + + while (sortedBuilds.hasNext()){ + int[] b = sortedBuilds.next(); + + if(ri(a) == li(b) && hi(a) == hi(b)){ + a = new int[]{li(a), ri(b), hi(a)}; + continue; + } + + // a.r b.l + if(ri(a) <= li(b)){ + all.add(new int[]{li(a), hi(a)}); + + if(ri(a) < li(b)){ + all.add(new int[]{ri(a), 0}); + } + + a = b; + continue; + } + + // a.l b.l + if(li(a) == li(b)){ + + // make a higher than b + if(hi(a) < hi(b)){ + sortedBuilds.insert(a); + a = b; + continue; + } + + if(ri(a) < ri(b)){ + sortedBuilds.insert(new int[]{ri(a), ri(b), hi(b)}); + } + // else drop b (b inside a) + continue; + } + + // + if(hi(a) < hi(b)){ + + all.add(new int[]{li(a), hi(a)}); + + if(ri(a) > ri(b)){ + sortedBuilds.insert(new int[]{ri(b), ri(a), hi(a)}); + } + + a = b; + continue; + } + + // a.h >= b.h + + if(ri(a) < ri(b)){ + sortedBuilds.insert(new int[]{ri(a), ri(b), hi(b)}); + } + // else drop b (b inside a) + } + + all.add(new int[]{li(a), hi(a)}); + all.add(new int[]{ri(a), 0}); + + return all; + } +} diff --git a/the-skyline-problem/index.md b/the-skyline-problem/index.md new file mode 100644 index 0000000..7e48923 --- /dev/null +++ b/the-skyline-problem/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: The Skyline Problem +date: 2015-05-28 19:45:44+08:00 +leetcode_id: 218 +--- +{% include_relative README.md %} diff --git a/trapping-rain-water/index.md b/trapping-rain-water/index.md index cfa47c3..db8107d 100644 --- a/trapping-rain-water/index.md +++ b/trapping-rain-water/index.md @@ -4,6 +4,4 @@ title: Trapping Rain Water date: 2014-12-29 00:26:24 +0800 leetcode_id: 42 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/triangle/index.md b/triangle/index.md index 15935f4..ad75db1 100644 --- a/triangle/index.md +++ b/triangle/index.md @@ -4,6 +4,4 @@ title: Triangle date: 2015-03-20 12:51:52 +0800 leetcode_id: 120 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/two-sum-ii-input-array-is-sorted/index.md b/two-sum-ii-input-array-is-sorted/index.md index fd0423c..624ff8c 100644 --- a/two-sum-ii-input-array-is-sorted/index.md +++ b/two-sum-ii-input-array-is-sorted/index.md @@ -4,6 +4,4 @@ title: Two Sum II - Input array is sorted date: 2015-01-23 12:45:49 +0800 leetcode_id: 167 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/two-sum-iii-data-structure-design/index.md b/two-sum-iii-data-structure-design/index.md index 56f45d1..bd983e9 100644 --- a/two-sum-iii-data-structure-design/index.md +++ b/two-sum-iii-data-structure-design/index.md @@ -4,6 +4,4 @@ title: Two Sum III - Data structure design date: 2015-01-21 18:05:09 +0800 leetcode_id: 170 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/two-sum/index.md b/two-sum/index.md index c4e3e82..4ccaf5a 100644 --- a/two-sum/index.md +++ b/two-sum/index.md @@ -3,8 +3,5 @@ layout: solution title: Two Sum date: 2014-12-29 00:26:24 +0800 leetcode_id: 1 -leetcode_id: 1 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/unique-binary-search-trees-ii/index.md b/unique-binary-search-trees-ii/index.md index e6ab9be..4947ffe 100644 --- a/unique-binary-search-trees-ii/index.md +++ b/unique-binary-search-trees-ii/index.md @@ -4,6 +4,4 @@ title: Unique Binary Search Trees II date: 2014-12-29 00:26:24 +0800 leetcode_id: 95 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/unique-binary-search-trees/index.md b/unique-binary-search-trees/index.md index b25c64f..697affa 100644 --- a/unique-binary-search-trees/index.md +++ b/unique-binary-search-trees/index.md @@ -4,6 +4,4 @@ title: Unique Binary Search Trees date: 2014-12-29 00:26:24 +0800 leetcode_id: 96 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/unique-paths-ii/index.md b/unique-paths-ii/index.md index 124cfbe..9b6ffcb 100644 --- a/unique-paths-ii/index.md +++ b/unique-paths-ii/index.md @@ -4,6 +4,4 @@ title: Unique Paths II date: 2014-12-29 00:26:24 +0800 leetcode_id: 63 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/unique-paths/index.md b/unique-paths/index.md index 33a3fc3..e2a8bf3 100644 --- a/unique-paths/index.md +++ b/unique-paths/index.md @@ -4,6 +4,4 @@ title: Unique Paths date: 2014-12-29 00:26:24 +0800 leetcode_id: 62 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/valid-anagram/README.md b/valid-anagram/README.md new file mode 100644 index 0000000..e69de29 diff --git a/valid-anagram/Solution.java b/valid-anagram/Solution.java new file mode 100644 index 0000000..5e64451 --- /dev/null +++ b/valid-anagram/Solution.java @@ -0,0 +1,11 @@ +public class Solution { + public boolean isAnagram(String s, String t) { + char[] S = s.toCharArray(); + char[] T = t.toCharArray(); + + Arrays.sort(S); + Arrays.sort(T); + + return Arrays.equals(S, T); + } +} diff --git a/valid-anagram/index.md b/valid-anagram/index.md new file mode 100644 index 0000000..cec6d9b --- /dev/null +++ b/valid-anagram/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Valid Anagram +date: 2015-08-06 22:22:20+08:00 +leetcode_id: 242 +--- +{% include_relative README.md %} diff --git a/valid-number/index.md b/valid-number/index.md index 9d189a4..f9cf82c 100644 --- a/valid-number/index.md +++ b/valid-number/index.md @@ -4,6 +4,4 @@ title: Valid Number date: 2014-12-29 00:26:24 +0800 leetcode_id: 65 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/valid-palindrome/index.md b/valid-palindrome/index.md index 69bfcac..bccb9c0 100644 --- a/valid-palindrome/index.md +++ b/valid-palindrome/index.md @@ -4,6 +4,4 @@ title: Valid Palindrome date: 2014-12-29 00:26:24 +0800 leetcode_id: 125 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/valid-parentheses/index.md b/valid-parentheses/index.md index 0a0e687..22f698f 100644 --- a/valid-parentheses/index.md +++ b/valid-parentheses/index.md @@ -4,6 +4,4 @@ title: Valid Parentheses date: 2014-12-29 00:26:24 +0800 leetcode_id: 20 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/valid-sudoku/index.md b/valid-sudoku/index.md index ff1e19f..5ee9111 100644 --- a/valid-sudoku/index.md +++ b/valid-sudoku/index.md @@ -4,6 +4,4 @@ title: Valid Sudoku date: 2014-12-29 00:26:24 +0800 leetcode_id: 36 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/validate-binary-search-tree/index.md b/validate-binary-search-tree/index.md index 716ea48..4b79c08 100644 --- a/validate-binary-search-tree/index.md +++ b/validate-binary-search-tree/index.md @@ -4,6 +4,4 @@ title: Validate Binary Search Tree date: 2014-12-29 00:26:24 +0800 leetcode_id: 98 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/verify-preorder-sequence-in-binary-search-tree/README.md b/verify-preorder-sequence-in-binary-search-tree/README.md new file mode 100644 index 0000000..e69de29 diff --git a/verify-preorder-sequence-in-binary-search-tree/Solution.java b/verify-preorder-sequence-in-binary-search-tree/Solution.java new file mode 100644 index 0000000..5ff0cb8 --- /dev/null +++ b/verify-preorder-sequence-in-binary-search-tree/Solution.java @@ -0,0 +1,31 @@ +public class Solution { + public boolean verifyPreorder(int[] preorder) { + int[] inorder = Arrays.copyOf(preorder, preorder.length); + Arrays.sort(inorder); + + LinkedList stack = new LinkedList<>(); // fuck + + stack.push(0); + stack.push(inorder.length); + + for(int p = 0; p < preorder.length; /*void*/){ + int ed = stack.pop(); + int st = stack.pop(); + + if(st >= ed) continue; + + int root = preorder[p++]; + + int i = Arrays.binarySearch(inorder, st, ed, root); + if(i < 0) return false; + + stack.push(i + 1); + stack.push(ed); + + stack.push(st); + stack.push(i); + } + + return true; + } +} diff --git a/verify-preorder-sequence-in-binary-search-tree/index.md b/verify-preorder-sequence-in-binary-search-tree/index.md new file mode 100644 index 0000000..48b4017 --- /dev/null +++ b/verify-preorder-sequence-in-binary-search-tree/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Verify Preorder Sequence in Binary Search Tree +date: 2015-08-15 11:47:30+08:00 +leetcode_id: 255 +--- +{% include_relative README.md %} diff --git a/wildcard-matching/index.md b/wildcard-matching/index.md index 7e5947e..59064c9 100644 --- a/wildcard-matching/index.md +++ b/wildcard-matching/index.md @@ -4,6 +4,4 @@ title: Wildcard Matching date: 2014-12-29 00:26:24 +0800 leetcode_id: 44 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/word-break-ii/Solution.java b/word-break-ii/Solution.java index 11df5fe..8873f6e 100644 --- a/word-break-ii/Solution.java +++ b/word-break-ii/Solution.java @@ -1,18 +1,5 @@ public class Solution { - String join(List list){ - if(list.isEmpty()) return ""; - - StringBuilder s = new StringBuilder(list.get(0)); - - for(int i = 1; i < list.size(); i++){ - s.append(' '); - s.append(list.get(i)); - } - - return s.toString(); - } - ArrayList[] P; char[] S; ArrayList rt; @@ -21,7 +8,7 @@ void joinAll(int offset, LinkedList parents){ if(P[offset].isEmpty()){ - rt.add(join(parents)); + rt.add(String.join(" ", parents)); return; } diff --git a/word-break-ii/index.md b/word-break-ii/index.md index 1f81e4d..6bc758c 100644 --- a/word-break-ii/index.md +++ b/word-break-ii/index.md @@ -1,9 +1,7 @@ --- layout: solution title: Word Break II -date: 2014-12-29 00:26:24 +0800 +date: 2015-05-11 00:01:22 +0800 leetcode_id: 140 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/word-break/index.md b/word-break/index.md index 69f62cf..784221f 100644 --- a/word-break/index.md +++ b/word-break/index.md @@ -4,6 +4,4 @@ title: Word Break date: 2014-12-29 00:26:24 +0800 leetcode_id: 139 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/word-ladder-ii/index.md b/word-ladder-ii/index.md index a76b3dd..e5f6699 100644 --- a/word-ladder-ii/index.md +++ b/word-ladder-ii/index.md @@ -4,6 +4,4 @@ title: Word Ladder II date: 2014-12-29 00:26:24 +0800 leetcode_id: 126 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/word-ladder/index.md b/word-ladder/index.md index 9458dce..e0df4cf 100644 --- a/word-ladder/index.md +++ b/word-ladder/index.md @@ -4,6 +4,4 @@ title: Word Ladder date: 2014-12-29 00:26:24 +0800 leetcode_id: 127 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/word-search-ii/README.md b/word-search-ii/README.md new file mode 100644 index 0000000..e69de29 diff --git a/word-search-ii/Solution.java b/word-search-ii/Solution.java new file mode 100644 index 0000000..1107f8b --- /dev/null +++ b/word-search-ii/Solution.java @@ -0,0 +1,141 @@ +public class Solution { + + static class TrieNode { + // Initialize your data structure here. + TrieNode parent; + int depth = 0; + + char character; + + TrieNode[] children = new TrieNode[26]; + + int count = 0; + + public TrieNode(TrieNode parent, char character) { + this.parent = parent; + this.character = character; + + if(parent != null) { + this.depth = parent.depth + 1; + } + } + + TrieNode safe(char c){ + int i = index(c); + + if(children[i] == null){ + children[i] = new TrieNode(this, c); + } + + return children[i]; + } + + int index(char c){ + return (int)(c - 'a'); + } + + void insert(char[] word, int st, int len){ + if(len == 0){ + this.count++; + return; + } + + TrieNode t = safe(word[st]); + + t.insert(word, st + 1, len - 1); + } + + TrieNode child(char c){ + return children[index(c)]; + } + + boolean hasChild(char c){ + return child(c) != null; + } + + String recover(){ + // assert count > 0 + TrieNode t = this; + char[] s = new char[depth]; + + for(int i = depth - 1; i >= 0; i--){ + s[i] = t.character; + t = t.parent; + } + + return new String(s); + } + } + + int flatten(int x, int y, int wide){ + return x * wide + y; + } + + boolean vaild(int x, int y, char[][] board){ + return x >= 0 && + y >= 0 && + x < board.length && + y < board[0].length; + } + + Set found = new HashSet<>(); + + void findWords(int x, int y, char[][] board, boolean[] vi, TrieNode current) { + + vi[flatten(x, y, board[0].length)] = true; + + if(current.count > 0){ + found.add(current.recover()); + } + + for(int[] xy : new int[][] { + {x + 1, y}, + {x, y + 1}, + {x - 1, y}, + {x, y - 1}, + }) { + int _x = xy[0]; + int _y = xy[1]; + + if(!vaild(_x, _y, board)){ + continue; + } + + if(vi[flatten(_x, _y, board[0].length)]) { + continue; + } + + TrieNode t = current.child(board[_x][_y]); + + if(t == null){ + continue; + } + + findWords(_x, _y, board, vi, t); + + vi[flatten(_x, _y, board[0].length)] = false; + } + + } + + public List findWords(char[][] board, String[] words) { + + TrieNode root = new TrieNode(null, '\0'); + + for(String w : words){ + root.insert(w.toCharArray(), 0, w.length()); + } + + final int LEN = board.length * board[0].length; + + for(int x = 0; x < board.length; x++){ + for(int y = 0; y < board[0].length; y++){ + if(root.hasChild(board[x][y])){ + findWords(x, y, board, new boolean[LEN], root.child(board[x][y])); + } + } + } + + return new ArrayList<>(found); + } +} diff --git a/word-search-ii/index.md b/word-search-ii/index.md new file mode 100644 index 0000000..2274fed --- /dev/null +++ b/word-search-ii/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Word Search II +date: 2015-05-20 00:32:45+08:00 +leetcode_id: 212 +--- +{% include_relative README.md %} diff --git a/word-search/index.md b/word-search/index.md index 9ee737d..753116f 100644 --- a/word-search/index.md +++ b/word-search/index.md @@ -4,6 +4,4 @@ title: Word Search date: 2014-12-29 00:26:24 +0800 leetcode_id: 79 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/zigzag-conversion/index.md b/zigzag-conversion/index.md index 1778316..20eb8c6 100644 --- a/zigzag-conversion/index.md +++ b/zigzag-conversion/index.md @@ -4,6 +4,4 @@ title: ZigZag Conversion date: 2014-12-29 00:26:24 +0800 leetcode_id: 6 --- -{% assign leetcode_name = {{page.path | remove: '/index.md'}} %} -{% assign leetcode_readme = {{leetcode_name | append: '/README.md' | prepend: '_root/' }} %} -{% include {{leetcode_readme}} %} +{% include_relative README.md %} diff --git a/zigzag-iterator/README.md b/zigzag-iterator/README.md new file mode 100644 index 0000000..e69de29 diff --git a/zigzag-iterator/Solution.java b/zigzag-iterator/Solution.java new file mode 100644 index 0000000..7f04d78 --- /dev/null +++ b/zigzag-iterator/Solution.java @@ -0,0 +1,37 @@ +public class ZigzagIterator { + + Iterator[] ivs; + + int p = 0; + + public ZigzagIterator(List v1, List v2) { + ivs = new Iterator[]{v1.iterator(), v2.iterator()}; + } + + public int next() { + for(;;){ + + Iterator i = ivs[p++ % ivs.length]; + + if(i.hasNext()){ + return i.next(); + } + } + } + + public boolean hasNext() { + for(Iterator i : ivs){ + if(i.hasNext()){ + return true; + } + } + + return false; + } +} + +/** + * Your ZigzagIterator object will be instantiated and called as such: + * ZigzagIterator i = new ZigzagIterator(v1, v2); + * while (i.hasNext()) v[f()] = i.next(); + */ diff --git a/zigzag-iterator/ZigzagIterator.java b/zigzag-iterator/ZigzagIterator.java new file mode 120000 index 0000000..e570129 --- /dev/null +++ b/zigzag-iterator/ZigzagIterator.java @@ -0,0 +1 @@ +Solution.java \ No newline at end of file diff --git a/zigzag-iterator/index.md b/zigzag-iterator/index.md new file mode 100644 index 0000000..acb4140 --- /dev/null +++ b/zigzag-iterator/index.md @@ -0,0 +1,7 @@ +--- +layout: solution +title: Zigzag Iterator +date: 2015-09-24 17:53:54+08:00 +leetcode_id: 281 +--- +{% include_relative README.md %}