diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
new file mode 100644
index 00000000..ccd81dff
--- /dev/null
+++ b/.devcontainer/devcontainer.json
@@ -0,0 +1,7 @@
+{
+ "name": "TeX Live",
+ "image": "soulmachine/texlive:latest",
+ "extensions": [
+ "James-Yu.latex-workshop"
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 00000000..72ac5ac3
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,31 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "lettcode-C++",
+ "type": "shell",
+ "command": "xelatex",
+ "args": [
+ "-synctex=1",
+ "-interaction=nonstopmode",
+ "leetcode-cpp.tex"
+ ],
+ "options": {
+ "cwd": "${workspaceFolder}/C++/"
+ }
+ },
+ {
+ "label": "lettcode-Java",
+ "type": "shell",
+ "command": "xelatex",
+ "args": [
+ "-synctex=1",
+ "-interaction=nonstopmode",
+ "leetcode-java.tex"
+ ],
+ "options": {
+ "cwd": "${workspaceFolder}/Java/"
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/C++/README.md b/C++/README.md
index 3e67d41b..a856af82 100644
--- a/C++/README.md
+++ b/C++/README.md
@@ -1,5 +1,7 @@
-#C++版
------------------
-**下载**:LeetCode题解(C++版).pdf
+# C++版
-书的内容与Java版一摸一样,不过代码是用C++写的。本书的代码使用 C++ 11 标准。
+## 编译
+
+```bash
+docker run -it --rm -v $(pwd):/project -w /project soulmachine/texlive xelatex -interaction=nonstopmode leetcode-cpp.tex
+````
diff --git a/C++/chapDFS.tex b/C++/chapDFS.tex
index 2c9f0ab8..f6c4c107 100644
--- a/C++/chapDFS.tex
+++ b/C++/chapDFS.tex
@@ -1248,8 +1248,8 @@ \subsection{深搜与递归的区别}
递归有两种加速策略,一种是\textbf{剪枝(prunning)},对中间结果进行判断,提前返回;一种是\textbf{缓存},缓存中间结果,防止重复计算,用空间换时间。
-其实,递归+缓存,就是 memorization。所谓\textbf{memorization}(翻译为备忘录法,见第 \S \ref{sec:dp-vs-memorization}节),就是"top-down with cache"(自顶向下+缓存),它是Donald Michie 在1968年创造的术语,表示一种优化技术,在top-down 形式的程序中,使用缓存来避免重复计算,从而达到加速的目的。
+其实,递归+缓存,就是 memoization。所谓\textbf{memoization}(翻译为备忘录法,见第 \S \ref{sec:dp-vs-memoization}节),就是"top-down with cache"(自顶向下+缓存),它是Donald Michie 在1968年创造的术语,表示一种优化技术,在top-down 形式的程序中,使用缓存来避免重复计算,从而达到加速的目的。
-\textbf{memorization 不一定用递归},就像深搜不一定用递归一样,可以在迭代(iterative)中使用 memorization 。\textbf{递归也不一定用 memorization},可以用memorization来加速,但不是必须的。只有当递归使用了缓存,它才是 memorization 。
+\textbf{memoization 不一定用递归},就像深搜不一定用递归一样,可以在迭代(iterative)中使用 memoization 。\textbf{递归也不一定用 memoization},可以用memoization来加速,但不是必须的。只有当递归使用了缓存,它才是 memoization 。
既然递归一定是深搜,为什么很多书籍都同时使用这两个术语呢?在递归味道更浓的地方,一般用递归这个术语,在深搜更浓的场景下,用深搜这个术语,读者心里要弄清楚他俩大部分时候是一回事。在单链表、二叉树等递归数据结构上,递归的味道更浓,这时用递归这个术语;在图、隐式图等数据结构上,深搜的味道更浓,这时用深搜这个术语。
diff --git a/C++/chapDynamicProgramming.tex b/C++/chapDynamicProgramming.tex
index 93a655d5..5327de51 100644
--- a/C++/chapDynamicProgramming.tex
+++ b/C++/chapDynamicProgramming.tex
@@ -514,7 +514,7 @@ \subsubsection{描述}
\subsubsection{分析}
-首先想到的是递归(即深搜),对两个string进行分割,然后比较四对字符串。代码虽然简单,但是复杂度比较高。有两种加速策略,一种是剪枝,提前返回;一种是加缓存,缓存中间结果,即memorization(翻译为记忆化搜索)。
+首先想到的是递归(即深搜),对两个string进行分割,然后比较四对字符串。代码虽然简单,但是复杂度比较高。有两种加速策略,一种是剪枝,提前返回;一种是加缓存,缓存中间结果,即memoization(翻译为记忆化搜索)。
剪枝可以五花八门,要充分观察,充分利用信息,找到能让节点提前返回的条件。例如,判断两个字符串是否互为scamble,至少要求每个字符在两个字符串中出现的次数要相等,如果不相等则返回false。
diff --git a/C++/chapImplement.tex b/C++/chapImplement.tex
index 28c53f61..40b88a2b 100644
--- a/C++/chapImplement.tex
+++ b/C++/chapImplement.tex
@@ -556,7 +556,7 @@ \subsubsection{相关题目}
\section{Pascal's Triangle} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\label{sec:pascals-triangle}
+\label{sec:pascal-s-triangle}
\subsubsection{描述}
@@ -638,7 +638,7 @@ \subsubsection{相关题目}
\section{Pascal's Triangle II} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\label{sec:pascals-triangle-ii}
+\label{sec:pascal-s-triangle-ii}
\subsubsection{描述}
@@ -1098,7 +1098,7 @@ \subsubsection{相关题目}
\section{Max Points on a Line} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\label{sec:Max-Points-on-a-Line}
+\label{sec:max-points-on-a-line}
\subsubsection{描述}
diff --git a/C++/chapLinearList.tex b/C++/chapLinearList.tex
index 76ac9624..bbc0ec1c 100644
--- a/C++/chapLinearList.tex
+++ b/C++/chapLinearList.tex
@@ -2666,7 +2666,7 @@ \subsubsection{相关题目}
\subsection{Linked List Cycle}
-\label{sec:Linked-List-Cycle}
+\label{sec:linked-list-cycle}
\subsubsection{描述}
@@ -2709,7 +2709,7 @@ \subsubsection{相关题目}
\subsection{Linked List Cycle II}
-\label{sec:Linked-List-Cycle-II}
+\label{sec:linked-list-cycle-ii}
\subsubsection{描述}
@@ -2769,7 +2769,7 @@ \subsubsection{相关题目}
\subsection{Reorder List}
-\label{sec:Reorder-List}
+\label{sec:reorder-list}
\subsubsection{描述}
@@ -2841,7 +2841,7 @@ \subsubsection{相关题目}
\subsection{LRU Cache}
-\label{sec:LRU-Cachet}
+\label{sec:lru-cache}
\subsubsection{描述}
diff --git a/C++/chapSorting.tex b/C++/chapSorting.tex
index 39c31fd3..f92c115a 100644
--- a/C++/chapSorting.tex
+++ b/C++/chapSorting.tex
@@ -1,7 +1,7 @@
\chapter{排序}
-\section{Merge Sorted Array} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\label{sec:merge-sorted-array}
+\section{Merge Two Sorted Arrays} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\label{sec:merge-two-sorted-arrays}
\subsubsection{描述}
@@ -98,34 +98,38 @@ \subsubsection{代码}
\begin{Code}
//LeetCode, Merge k Sorted Lists
// 时间复杂度O(n1+n2+...),空间复杂度O(1)
-// TODO: 会超时
class Solution {
public:
- ListNode *mergeKLists(vector &lists) {
- if (lists.size() == 0) return nullptr;
- ListNode *p = lists[0];
- for (int i = 1; i < lists.size(); i++) {
- p = mergeTwoLists(p, lists[i]);
+ ListNode * mergeTwo(ListNode * l1, ListNode * l2){
+ if(!l1) return l2;
+ if(!l2) return l1;
+ ListNode dummy(-1);
+ ListNode * p = &dummy;
+ for(; l1 && l2; p = p->next){
+ if(l1->val > l2->val){
+ p->next = l2; l2 = l2->next;
+ }
+ else{
+ p->next = l1; l1 = l1->next;
+ }
}
- return p;
+ p->next = l1 ? l1 : l2;
+ return dummy.next;
}
- // Merge Two Sorted Lists
- ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
- ListNode head(-1);
- for (ListNode* p = &head; l1 != nullptr || l2 != nullptr; p = p->next) {
- int val1 = l1 == nullptr ? INT_MAX : l1->val;
- int val2 = l2 == nullptr ? INT_MAX : l2->val;
- if (val1 <= val2) {
- p->next = l1;
- l1 = l1->next;
- } else {
- p->next = l2;
- l2 = l2->next;
- }
+ ListNode* mergeKLists(vector& lists) {
+ if(lists.size() == 0) return nullptr;
+
+ // multi pass
+ deque dq(lists.begin(), lists.end());
+ while(dq.size() > 1){
+ ListNode * first = dq.front(); dq.pop_front();
+ ListNode * second = dq.front(); dq.pop_front();
+ dq.push_back(mergeTwo(first,second));
}
- return head.next;
+
+ return dq.front();
}
};
\end{Code}
@@ -139,7 +143,7 @@ \subsubsection{相关题目}
\section{Insertion Sort List} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\label{sec:Insertion-Sort-List}
+\label{sec:insertion-sort-list}
\subsubsection{描述}
@@ -188,7 +192,7 @@ \subsubsection{相关题目}
\section{Sort List} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\label{sec:Sort-List}
+\label{sec:sort-list}
\subsubsection{描述}
@@ -276,7 +280,7 @@ \subsubsection{代码}
public:
int firstMissingPositive(vector& nums) {
bucket_sort(nums);
-
+
for (int i = 0; i < nums.size(); ++i)
if (nums[i] != (i + 1))
return i + 1;
@@ -385,7 +389,7 @@ \subsubsection{代码3}
class Solution {
public:
void sortColors(vector& nums) {
- partition(partition(nums.begin(), nums.end(), bind1st(equal_to(), 0)),
+ partition(partition(nums.begin(), nums.end(), bind1st(equal_to(), 0)),
nums.end(), bind1st(equal_to(), 1));
}
};
diff --git a/C++/chapStackAndQueue.tex b/C++/chapStackAndQueue.tex
index fd130ee0..9dacb601 100644
--- a/C++/chapStackAndQueue.tex
+++ b/C++/chapStackAndQueue.tex
@@ -242,7 +242,7 @@ \subsubsection{相关题目}
\subsection{Evaluate Reverse Polish Notation} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\label{sec:Evaluate-Reverse-Polish-Notation}
+\label{sec:evaluate-reverse-polish-notation}
\subsubsection{描述}
diff --git a/C++/chapTree.tex b/C++/chapTree.tex
index 5453fb71..7e70c7b5 100644
--- a/C++/chapTree.tex
+++ b/C++/chapTree.tex
@@ -368,7 +368,7 @@ \subsubsection{相关题目}
\subsection{Binary Tree Level Order Traversal}
-\label{sec:binary-tree-tevel-order-traversal}
+\label{sec:binary-tree-level-order-traversal}
\subsubsection{描述}
@@ -623,8 +623,8 @@ \subsubsection{递归版}
\subsubsection{迭代版}
\begin{Code}
-//LeetCode, Binary Tree Zigzag Level Order Traversal
-//广度优先遍历,用一个bool记录是从左到右还是从右到左,每一层结束就翻转一下。
+// LeetCode, Binary Tree Zigzag Level Order Traversal
+// 广度优先遍历,用一个bool记录是从左到右还是从右到左,每一层结束就翻转一下。
// 迭代版,时间复杂度O(n),空间复杂度O(n)
class Solution {
public:
@@ -1447,15 +1447,15 @@ \subsubsection{分析}
\subsubsection{代码}
\begin{Code}
-// LeetCode, Validate Binary Search Tree
+// Validate Binary Search Tree
// 时间复杂度O(n),空间复杂度O(\logn)
class Solution {
public:
bool isValidBST(TreeNode* root) {
- return isValidBST(root, INT_MIN, INT_MAX);
+ return isValidBST(root, LONG_MIN, LONG_MAX);
}
- bool isValidBST(TreeNode* root, int lower, int upper) {
+ bool isValidBST(TreeNode* root, long long lower, long long upper) {
if (root == nullptr) return true;
return root->val > lower && root->val < upper
diff --git a/Java/README.md b/Java/README.md
index 8886a0b4..73032b56 100644
--- a/Java/README.md
+++ b/Java/README.md
@@ -1,3 +1,7 @@
#Java版
-----------------
-书的内容与C++版一摸一样,不过代码是用Java写的。本书的代码要求 Java 6 以上。
+
+## 编译
+
+ docker pull soulmachine/texlive
+ docker run -it --rm -v $(pwd):/data -w /data soulmachine/texlive-full xelatex -synctex=1 -interaction=nonstopmode leetcode-java.tex
diff --git a/README.md b/README.md
index 21fce47a..9af9ce21 100644
--- a/README.md
+++ b/README.md
@@ -1,89 +1,41 @@
-#LeetCode题解
------------------
-##PDF下载
-LeetCode题解(C++版).pdf
-
-C++ 文件夹下是C++版,内容一模一样,代码是用C++写的。
-
-Java 文件夹下是Java版,目前正在编写中,由于拖延症,不知道猴年马月能完成。
-
-##LaTeX模板
-本书使用的是陈硕开源的[模板](https://github.com/chenshuo/typeset)。这个模板制作精良,很有taste,感谢陈硕 :)
+# LeetCode题解
-##在Windows下编译
-1. 安装Tex Live 2013 。把bin目录例如`D:\texlive\2013\bin\win32`加入PATH环境变量。
-1. 安装字体。这个LaTex模板总共使用了9个字体,下载地址 ,有的字体Windows自带了,有的字体Ubuntu自带了,但都不全,还是一次性安装完所有字体比较方便。
-1. 安装TeXstudio
-1. (可选)启动Tex Live Manager,更新所有已安装的软件包。
-1. 配置TeXstudio。
+## 在线阅读
- 启动Texstudio,选择 `Options-->Configure Texstudio-->Commands`,XeLaTex 设置为 `xelatex -synctex=1 -interaction=nonstopmode %.tex`;
+
- 选择 `Options-->Configure Texstudio-->Build`
+## PDF下载
- Build & View 由默认的 PDF Chain 改为 Compile & View;
-
- Default Compiler 由默认的PdfLaTex 修改为 XeLaTex ;
-
- PDF Viewer 改为 “Internal PDF Viewer(windowed)”,这样预览时会弹出一个独立的窗口,这样比较方便。
-
-1. 编译。用TeXstudio打开`leetcode-cpp.tex`,点击界面上的绿色箭头就可以开始编译了。
-
- 在下方的窗口可以看到TeXstudio正在使用的编译命令是`xelatex -synctex=1 -interaction=nonstopmode "leetcode-cpp".tex`
+LeetCode题解(C++版).pdf
-##在Ubuntu下编译
-1. 安装Tex Live 2013
-
- 1.1. 下载TexLive 2013 的ISO 光盘,地址
+C++ 文件夹下是C++版,内容一模一样,代码是用C++写的。
- 1.2 mount 光盘,`sudo ./install-tl` 开始安装
+Java 文件夹下是Java版,目前正在编写中,由于拖延症,不知道猴年马月能完成。
- 1.3 加入环境变量
+## 如何编译PDF
- sudo vi /etc/profile
- export PATH=$PATH:/usr/local/texlive/2013/bin/x86_64-linux
- export MANPATH=$MANPATH:/usr/local/texlive/2013/texmf-dist/doc/man
- export INFPATH=$INFPATH:/usr/local/texlive/2013/texmf-dist/doc/info
+### 命令行编译
-1. 安装字体。这个LaTex模板总共使用了9个字体,下载地址 ,有的字体Windows自带了,有的字体Ubuntu自带了,但都不全,还是一次性安装完所有字体比较方便。
-1. 安装TeXstudio
-1. 配置TeXstudio。
+```bash
+docker run -it --rm -v $(pwd)/C++:/project -w /project soulmachine/texlive xelatex -interaction=nonstopmode leetcode-cpp.tex
+```
- 启动Texstudio,选择 `Options-->Configure Texstudio-->Commands`,XeLaTex 设置为 `xelatex -synctex=1 -interaction=nonstopmode %.tex`;
+### vscode下编译
- 选择 `Options-->Configure Texstudio-->Build`
+本项目已经配置好了vscode devcontainer, 可以在 Windows, Linux 和 macOS 三大平台上编译。
- Build & View 由默认的 PDF Chain 改为 Compile & View;
+用 vscode 打开本项目,选择右下角弹出的 `"Reopen in Container"`,就会在容器中打开本项目,该容器安装了 Tex Live 2022 以及所需要的10个字体。
- Default Compiler 由默认的PdfLaTex 修改为 XeLaTex ;
+点击vscode左下角的齿轮图标,选择 `Command Palette`,输入`tasks`, 选择 `Run Task`, 选择 `leetcode-C++`,即可启动编译。
- PDF Viewer 改为 “Internal PDF Viewer(windowed)”,这样预览时会弹出一个独立的窗口,这样比较方便。
+## LaTeX模板
-1. 编译。用TeXstudio打开`leetcode-cpp.tex`,点击界面上的绿色箭头就可以开始编译了。
+本书使用的是陈硕开源的[模板](https://github.com/chenshuo/typeset)。这个模板制作精良,感谢陈硕 :)
- 在下方的窗口可以看到TeXstudio正在使用的编译命令是`xelatex -synctex=1 -interaction=nonstopmode "leetcode-cpp".tex`
-1. 懒人版镜像。如果不想进行上面繁琐的安装过程,我做好了一个Ubuntu VMware虚拟机镜像,已经装好了TexLive 2013, TexStudio和字体(详细的安装日志见压缩包注释),开箱即用,下载地址 。
+这个LaTex模板总共使用了10个字体,下载地址 。有的字体Windows自带了,有的字体Ubuntu自带了,但都不全,还是一次性安装完所有字体比较方便。
-##如何贡献代码
-编译通过后,就具备了完整的LaTeX编译环境了。
+也可以参考 [Dockerfile](https://github.com/soulmachine/docker-images/blob/master/texlive/Dockerfile) 去学习如何安装所有字体。
-本书模板已经写好了,基本上不需要很多LaTeX知识就可以动手了。
+## 贡献代码
欢迎给本书添加内容或纠正错误,在自己本地编译成PDF,预览没问题后,就可以发pull request过来了。
-
-##北美求职QQ群
-
-237669375
-
-## 【友情推荐】九章算法
-
-1. 算法辅导在线视频直播课程:
-
-
-## AlgoHub
-
- 是我建立的一个刷题网站,即将上线,敬请期待
-
-## 纸质书
-**本书即将由电子工业出版社出版,敬请期待**
-
diff --git "a/\345\217\202\350\200\203\350\265\204\346\226\231/silicon-job.jpeg" "b/\345\217\202\350\200\203\350\265\204\346\226\231/silicon-job.jpeg"
new file mode 100644
index 00000000..dd349c0b
Binary files /dev/null and "b/\345\217\202\350\200\203\350\265\204\346\226\231/silicon-job.jpeg" differ