LeetCode solutions

Table of Contents

You have solved 489/1771 problems. 主要追求两个目标:代码简短,时间空间复杂度低。

注记

4-sum

使用了multimap,时间复杂度\(O(n^2\log{n})\),得到所有答案后不需要去重操作。

合法的四元组有三类:

  • a<=b<c<=d,枚举c和d,判断是否存在和为target-c-d的二元组
  • a<=b=c<=d,枚举b和d,判断是否存在target-b-b-d
  • a=b=c<=d,枚举a,判断是否存在target-a-a-a

分别统计,小心实现可以保证不会产生相同的候选解,从而无需去重。

Alien Dictionary

对于每一对单词,可以确定去除最长公共前缀后的下一对字母的大小关系。两个单词的最长公共前缀等于夹在其中的(所有相邻单词对的最长公共前缀)的最小值。根据相邻单词对的信息即可推得所有任意单词对的信息。因此只需根据相邻单词对求出拓扑关系。

Basic Calculator

这是operator-precedence grammar,可以用operator-precedence parser计算。这类算法的一个特例是shunting-yard algorithm,适用于本题。 为了方便,我假设字串开头和末尾都有隐含的'\0'字符。使用的文法如下:

S := %x00 E %x00
E := E "+" E
E := E "-" E
E := ( E )
E := 1*DIGIT

参考http://www.scribd.com/doc/51358638/16/Operator-Precedence-Relations。

在比较两个操作符时,区分左手边和右手边,左手边用于先处理的操作符,右手边为新来的操作符。使用左手边操作符的in-stack precedence(isp)和右手边操作符的incoming precedence(icp)进行比较。立即数可以看作icp很大,因此shift后可以立刻reduce。

Best Time to Buy and Sell Stock IV

线性解法。见2015-03-27-leetcode-best-time-to-buy-and-sell-stock-iv。

Closest Binary Search Tree Value II

题意:求BST中与目标值最接近的k个节点。 BST中关键字小于等于目标值的所有节点可以用若干(不带右孩子的子树)表示。这些(不带右孩子的子树)在一条链上,可以用栈维护,得到用于计算前驱的的迭代器。求出目标值的k个前驱的时间复杂度为\(O(depth+k)\)。 类似地,大于目标值的所有节点也可以组织成一个迭代器。 两个迭代器做合并操作,获得前k个最接近的值。

Contains Duplicate III

以\(t+1\)为单位把元素分桶,若一个桶内包含两个元素,则它们的差一定小于等于\(t\);差小于等于\(t\)的数对还可能出现在相邻两个桶之间。对于\(vector\)的各个元素,计算当前元素应放置的桶的编号\(j\),检查三个桶\(j-1,j,j+1\),判断之前\(k-1\)个元素里是否有差值小于等于\(t\)的元素。

Course Schedule

拓扑排序。入度减为0的顶点即成为候选,可以把入度向量组织成单链表,从而无需使用额外的队列或栈存储候选顶点,减小空间占用。

Dungeon Game

动态规划,对于每个格子记录从它出发顺利到达终点需要的最小血量。从\((m-1,n-1)\)递推至\((0,0)\)。

注意对于每个格子其实有进和出两个状态:进入该格子时(未考虑当前格子影响);和离开该格子后(已考虑当前格子影响)。这两种方法都行,考虑到程序的结构可能有三部分:初始化边界条件、状态转移、根据状态表示答案,需要仔细斟酌以追求代码简短。这里两种方式并无明显代码长度差异。

Expression Add Operators

见2015-10-16-leetcode-expression-add-operators。

Find Minimum in Rotated Sorted Array

方法是二分,如果要写短可以采用下面的思路: 子数组中如果有相邻两个元素a[i]>a[i+1],则a[i+1]是整个数组的最小值。 若子数组a[i..j]满足a[i]>a[j],则存在i<=k<j使得a[k]>a[k+1]。 对于子数组a[l..h]判断a[l]>a[m]或a[m]>a[h]是否有一个成立,成立则可以去除一半候选元素,不然a[h]>a[l]为一个逆序对。

Find Minimum in Rotated Sorted Array II

留意几个特殊情形:[1,0,1,1,1]、[1,1,1,0,1]。

对于子数组a[l..h],令m=floor(l+h)/2(注意m可能等于l)。判断a[l]>a[m]或a[m]>a[h]是否有一个成立,成立则可以去除一半候选元素。 若两个条件均不满足则a[l]<=a[m]<=a[h],若a[h]>a[l]则说明a[l]最小,否则a[l]=a[m]=a[h],可以把范围缩小为a[l+1..h-1]。

另外一种方法是只判断a[m]与a[h]`的大小关系。

Find Peak Element

二分查找,把区间缩小为仍包含候选值的子区间。对于相邻两个元素\(a\)、\(b\),若\(a>b\)则\(a\)及左边部分存在peak,否则\(b\)及右边部分存在peak。不关心\(a\)或\(b\)是否满足peak条件,将区间折半。

int l = 0, h = a.size();
while (l < h-1) {
  int m = l+h >> 1;
  if (a[m-1] > a[m]) h = m;
  else l = m;
}
return l;

或者检查中间元素是否满足要求,可以提前退出循环。

int l = 0, h = a.size();
while (l < h-1) {
  int m = l+h >> 1;
  if (a[m-1] > a[m]) h = m;
  else if (m+1 == h || a[m] > a[m+1]) l = h = m;
  else l = m+1;
}
return l;

First Missing Possitive

空间复杂度\(O(1)\)。

Fraction to Recurring Decimal

注意INT_MIN/(-1)会溢出。

Graph Valid Tree

\(n\)个节点的树的判定方式:

  • 有\(n-1\)条边且没有simple circle。可以用union-find algorithm判断。
  • 联通且无simple circle。可以用graph traversal。

Guess Number Higher or Lower II

动态规划优化,\(O(n^2)\)。见张昆玮的分析:http://artofproblemsolving.com/community/c296841h1273742s3_leetcode_guess_number_higher_or_lower_ii。

Invert Binary Tree

选择一种binary tree traversal算法,节点访问改成交换左右孩子即可。 如果要O(1)空间的话,得借鉴Morris pre/in-order traversal的思路,该算法的核心是通过左子树最右节点的右孩子是否指向当前节点来判断当前节点被访问到的次数,从而决定当前应该进行的操作(探索左子树或访问当前节点)。但交换子树操作会弄乱左子树最右节点的位置,因此pre-order和in-order都行不通,但post-order可行。Morris post-order traversal(这个叫法也许不恰当)可以参考https://www.quora.com/What-is-a-good-way-to-implement-stackless-recursion-less-post-order-traversal-for-a-non-threaded-binary-tree-using-Morris-method的描述,pre/in-order的访问是针对一个节点进行的,但post-order则需要对当前节点左子树的右链进行,并且需要翻转两次以达到按post-order输出的效果。但这里只需要保证每个节点都被访问一次,不需要严格的post-order顺序,因此无需翻转操作。

Jump Game

空间复杂度\(O(1)\)。

Jump Game II

使用output-restricted queue优化的动态规划,注意到动态规划值的单增性可以用类似BFS的方式,空间复杂度\(O(1)\)。

Lexicographical Numbers

在trie中找1~n,存在迭代解法。

Linked List Cycle II

单链表找圈。Brent's cycle detection algorithm或Floyd's cycle detection algorithm。

如果只需要判断是否有圈,而不用指出圈的起点,可以使用pointer reversal。访问链表的过程中翻转链表,倘若访问到NULL,则说明无圈;若回到了起点,则说明有圈。如果有圈的话,算法执行完毕后,圈的方向会被反转,可以再执行一次翻转过程还原。下面是这个方法的实现:

// return true if a cycle is detected
bool pointerReversal(ListNode *head) {
  if (! head) return false;
  ListNode *x = head->next, *y, *z = head;
  while (x && x != head) {
    y = x->next;
    x->next = z;
    z = x;
    x = y;
  }
  return x == head;
}

Longest Palindromic Substring

线性时间求出以每个位置为中心的最长回文子串的Manacher's algorithm。http://www.csie.ntnu.edu.tw/~u91029/Palindrome.html提供的描述感觉最清晰。但实现我更喜欢我从某本stringology书上看到的。

Majority Element

Boyer-Moore majority vote algorithm http://www.cs.utexas.edu/~moore/best-ideas/mjrty/,思路是每次找到两个不同的元素并丢弃,这样做不会丢失解。容器里只剩下一种元素时,它就是majority。

Majority Element II

Boyer-Moore majority vote algorithm的扩展,找出所有出现次数大于\(\lfloor N/K \rfloor\)的元素。方法是每次找出\(K\)个互不相同的元素丢掉,最后剩下的元素是候选解。时间复杂度\(O(N*K)\)。

Maximum Gap

平均数原理,求出极差\(d\)后,根据桶大小\(\lceil \frac{d}{n-1}\rceil\)分成若干个桶,答案必为不同桶的两个元素之差。

Maximum Subarray

Kadane's algorithm

Meeting Rooms II

题意中两条线段冲突当且仅当它们的公共部分长度大于0。 这是interval graph,所求的是chromatic number,interval graph包含与perfect graph,因此chromatic number等于maximum clique顶点数,即最大线段相交数,可以把所有端点排序计算。 或者按起始端点排序后用贪心算法:维护若干线段集合,按起始端点总从小到大考虑每个线段,任选一个不冲突的集合加入,若无不冲突的集合则自成一个新集合。最后,集合数即为答案。实现时,每个集合用最大右端点值表示,所有集合组织为一个小根binary heap,若当前考虑线段的起始点小于根则压入一个新元素,否则修改根的值。

Merge k Sorted Lists

Tournament sort,可以用priority_queue实现。

Min Stack

使用两个栈,原栈S存放各个元素。每当新元素小于等于当前最小值时,就把新元素复制一份压入另一个栈S'。弹出时,若元素在S'中出现,则也从S'中弹出。

另一种方法是记录新元素与当前最小值的差值,每个元素需要多记录1个bit。可惜C++会Memory Limit Exceeded,感觉不合理。

Minimum Window Substring

尺取法

Missing Number

从左到右考虑每个元素,若不等于它的位置则把它交换到正确的位置并重复此过程。

N Queen

bitmask存储列,正反斜线控制的格子。

Number of 1 Bits

求popcount。__builtin_popcount()或者网上查找各种bit twiddling hacks。

One Edit Distance

编辑距离为1有三种可能:S比T多一个字符、T比S多一个字符、S与T长度相同且有一个位置不同。除去最长公共前缀和最长公共后缀,三种可能的检查方式可以统一为判断较长的串长度是否为1。

Palindrome Partitioning

f[i][j] = calc(f[ii][jj] : i <= ii <= jj <= j)形式的动态规划可以采用如下计算方式。

for (int i = n; --i >= 0; )
  for (int j = i; j < n; j++) {
    // calc [i,j]
  }

Palindrome Partitioning II

求原串的最少回文串划分。O(n^2)时间,可以优化到O(n)空间。

我没能找到比O(n^2)快的算法。相关的问题有检测一个串是否分割成k个回文串。k小于等于4时均有线性算法,参见Text Algorithms一书Theorem 8.17。k大于4时不确定。

Perfect Rectangle

使用unordered_map的\(O(n)\)解法:判断除了四个极点,每个小矩形的角是否被两个或四个矩形共享。

或者判断所有小矩形面积和等于四个极点围成的矩形的面积,并且小矩形没有重叠(用sweep line判断)。

Perfect Squares

https://leetcode.com/discuss/57477/sqrt-applying-fermats-theorm-brahmagupta-fibonacci-identity

由Lagrange's four-square theorem知答案为1~4,由Legendre's three-square theorem检查答案是否为4。若小于4,则再\(O(\sqrt{n})\)尺取法检查是否是perfect square或能表示为两个perfect squares之和,若不是则答案为3。

另有期望\(O((\log n)^2)\)的算法,参见M. O. Rabin, J. O. Shallit, Randomized Algorithms in Number Theory, Communications on Pure and Applied Mathematics 39 (1986), no. S1, pp. S239–S256. doi:10.1002/cpa.3160390713

Reconstruct Itinerary

题目即lexicographically smallest Eulerian path。Eulerian path最简单的算法是Hierholzer's algorithm,有向图中仅有一个顶点出度=入度+1,记为源;一个顶点入度=出度+1,记为汇。任求一条源到汇的路径,之后把各个圈合并到路径上即可。本题要求字典序最小,对Hierholzer's algorithm稍加变形即可。

从源开始,贪心地选择序号最小的下一个顶点,删除这条边,重复此过程,即得到一条源到汇的路径。需要把圈添加到该路径上。若一个圈只包含路径上的一个顶点,那么在该顶点处添加圈即可。若一个圈包含路径上的多个顶点,那么应该把它放在离汇最近的顶点上,这样能保证字典序最小。

Recover Binary Search Tree

使用Morris in-order traversal找到邻接失序对。

如果交换的元素相邻,则有一个邻接失序对(如0 1 2 3 4 -> 0 1 3 2 4),否则有两个邻接失序对(如0 1 2 3 4 5 -> 0 4 2 3 1 5)。

Remove Nth Node From End of List

http://meta.slashdot.org/story/12/10/11/0030249/linus-torvalds-answers-your-questions

使用pointers-to-pointers很多时候能简化实现。

Regular Expression Matching

P为模式串,T为文本, f[i][j]表示P的前i个字符能否匹配T的前j个字符。 根据f[i-1][*]计算f[i][*]。 这个方法也可以看作构建了精简表示的Thompson's automaton,时间复杂度\(O(|P|\cdot |T|)\)。

Remove Element

原地修改数组,我喜欢把这种操作称作deflate。

Remove Invalid Parentheses

最少移除个数很容易计算,把可以配对的左右括号全部抵消,剩余括号数即是(形如:)))...((()。难点在于输出所有不同答案,多数解法使用DFS枚举要删除哪些括号,枚举量大于答案个数。 有一个枚举量固定为答案个数的方法,找到残余串)))...(((中右括号与左括号的分割点。DFS分割点左半部分,保证到达残余串第\(i\)个右括号时,至少有\(i\)个右括号(原串的)被删除。分割点右半部分也如法炮制,两边合并即为答案。

Repeated DNA Sequences

可以用类似Rabin-Karp的rolling hash方法,求出所有长为10的子串的hash值,判断是否有重复。只有四个字符,长度为10,故可以使用polynomial hash code。 另外也可以用suffix tree/suffix array等方法,找longest common prefix大于等于10的两个后缀。注意不能重复输出字串。

Reverse Bits

Hacker's Delight (2nd) 7.1 Reversing Bits and Bytes。

Rotate Array

经典的三次reverse,或者拆成gcd(k,n)个置换群循环右移一格。

Same Tree

类似于same fringe problem,可以试验generator、co-routine、lazy evaluation、continuation等。如果要O(1)的空间复杂度可以用Morris in-order traversal等方法。

Set Matrix Zeroes

\(O(1)\)空间复杂度。使用两个标志表示第0行或第0列是否需要清零,之后用第0行表示各列是否需要清零,第0列表示各行是否需要清零。

Search For a Range

设序列用区间表示为[begin,end)。使用C++ STL风格的lower_bound、upper_bound。有几点好处:

  • 循环内只有一次比较
  • 循环退出后两个指针相等,且落在[begin,end],都是迭代器的合法取值。某些binary search写法返回值可能为begin-1,某些容器不合法
  • [lower_bound(a[],x), upper_bound(a[],x)给出了元素x所在的子区间

Search Insert Position

C++ <algorithm>的lower_bound。

Serialize and Deserialize Binary Tree

把NULL视作叶子,则pre/in/post-order traversal可以用于编码。若使用Morris traversal则额外空间为\(O(1)\)。解码时使用类似Schorr-Waite graph marking algorithm的edge crawling技巧即可做到额外空间\(O(1)\)。

Shortest Palindrome

找出原串的最长回文前缀,用Manacher's algorithm求解,把剩下部分复制一份、翻转后、接到左边,就得到了最短的回文串。求最长回文前缀的另一种方法是把原串以及翻转用特殊字符隔开,用Morris-Pratt algorithm求border,该值即为最长回文前缀长度。

Single Number III

所有数的xor等于两个出现一次的数的xor,不妨设为k,则k & -k为二进制表示上某个为1的数位。根据这个数位把所有元素划分成两份,每份只有一个出现一次的数。

Smallest Good Base

设\(n=1+k+k^2+\ldots+k^m\),由\(n>k^m\)得\(k<n^{1/m}\),由\((1+k)^m>n\)得\(k+1>n^{1/m}\),因此\(n^{1/m}-1<k<n^{1/m}\)。枚举\(m\),\(k\)唯一可能取值为\(floor(n^{1/m})\),判断是否成立。

Sort Colors

Dutch national flag problem。如果不要求000111222,允许111000222111,那么有交换次数更少的Bentley-McIlroy算法http://www.iis.sinica.edu.tw/~scm/ncs/2010/10/dutch-national-flag-problem-3/

Sqrt(x)

Hacker's Delight (2nd) 11.1.1。 牛顿迭代法。46340 = floor(sqrt(INT_MAX))

Scramble String

我用了\(O(n^3)\)的空间和\(O(n^4)\)的时间,应该有更好的算法。但查阅了一些文献还没有找到。

Sort List

我用了较麻烦的natural merge sort。Quicksort实现会简单很多。

Strobogrammatic Number III

定义一个函数,用于计算小于给定数的strobogrammatic number个数,则用减法即可得到题目所求。下面考虑如何计算这个函数。 小于给定数high的strobogrammatic number分为两类:

  • 位数不够的,可看作有若干前导0。容易求得。
  • 位数相同。可以枚举与high的公共前缀的长度,再计算下一个数位小于high中对应数位的strobogrammatic number个数。由于位数为\(n\)的strobogrammatic number只有\(ceil(n/2)\)个数位是独立的,枚举的公共前缀长度得小于\(\lceil n/2\rfrac\)。

Sudoku Solver

转化为exact cover problem,使用dancing links + Algorithm X求解。

Trapping Rain Water

两个指针夹逼,空间\(O(1)\)。

Unique Binary Search Trees II

类似动态规划的思想,子树可以复用。

Wiggle Sort

从左到右考虑每一对相邻元素,如果不满足大小关系则交换,交换不会影响之前一对元素的大小关系。

Word Ladder

基本方法是BFS或bidirectional BFS,相邻关系的确定有两种思路:枚举所有其他顶点判断是否相邻、枚举顶点的变异判断是否为顶点。对于第一种思路,还可以利用一个技巧:把所有字串都分为左右两半,若两个字串hamming distance为1,则左半部分相同或右半部分相同。

Verify Preorder Sequence in Binary Search Tree

对于前序序列中的递减连续段,它们形成了BST的某个左孩子链。

Maximal Rectangle

秋叶拓哉(iwi)、岩田阳一(wata)和北川宜稔(kita_masa)所著,巫泽俊(watashi)、庄俊元(navi)和李津羽(itsuhane)翻译的《挑战程序设计竞赛》

逐行扫描棋盘,对于每一行\(i\)记录三个值:

  • \(h_j\)表示第\(j\)列上方连续为1的行数:h[j] = a[i][j] == 0 ? 0 : h[j]+1;
  • 若\(a_{i,j}=1\),令\(l_j\)为\(min(k : h_{k+1\ldots j}\ge h_j)\);若\(a_{i,j}=0\)则设为\(j\)
  • 若\(a_{i,j}=1\),令\(r_j\)为\(max(k : h_{j\ldots k-1}\ge h_j)\);若\(a_{i,j}=0\)则设为\(j\)

\(l\)的计算方式是:

if a[i][j] == 0:
  l[j] = j
elif h[j] == 1:
  l[j] = j-(a[i][j]及左边连续的1的个数)+1
else
  # 下式中右边的l[j]是第i-1行计算得到的l[j]
  l[j] = min(l[j], j-(a[i][j]及左边连续的1的个数)+1)

\(r\)的计算类似。对于每一列\(j\),\((r_j-l_j+1)\times h_j\)是一个候选解。

#define ROF(i, a, b) for (int i = (b); --i >= (a); )
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define REP(i, n) for (int i = 0; i < (n); i++)

class Solution {
public:
  int maximalRectangle(vector<vector<char> > &a) {
    if (a.empty()) return 0;
    int m = a.size(), n = a[0].size(), ans = 0;
    vector<int> h(n), l(n), r(n, n-1);
    REP(i, m) {
      int ll = -1;
      REP(j, n) {
        h[j] = a[i][j] == '1' ? h[j]+1 : 0;
        if (a[i][j] == '0') ll = j;
        l[j] = h[j] ? max(h[j] == 1 ? 0 : l[j], ll+1) : j;
      }
      int rr = n;
      ROF(j, 0, n) {
        if (a[i][j] == '0') rr = j;
        r[j] = h[j] ? min(h[j] == 1 ? n-1 : r[j], rr-1) : j;
        ans = max(ans, (r[j]-l[j]+1)*h[j]);
      }
    }
    return ans;
  }
};

潘宇超 2008

#define ROF(i, a, b) for (int i = (b); --i >= (a); )
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define REP(i, n) for (int i = 0; i < (n); i++)

class Solution {
public:
  int maximalRectangle(vector<vector<char> > &a) {
    if (a.empty()) return 0;
    int m = a.size(), n = a[0].size(), ans = 0;
    vector<int> h(n), l(n), r(n, n-1);
    REP(i, m) {
      REP(j, n) {
        h[j] = a[i][j] == '1' ? h[j]+1 : 0;
        l[j] = j;
        while (l[j] && h[l[j]-1] >= h[j])
          l[j] = l[l[j]-1];
      }
      ROF(j, 0, n) {
        r[j] = j;
        while (r[j]+1 < n && h[j] <= h[r[j]+1])
          r[j] = r[r[j]+1];
        ans = max(ans, (r[j]-l[j]+1)*h[j]);
      }
    }
    return ans;
  }
};

ACRush某TopCoder SRM

逐行扫描棋盘,对于每一行记录\(h_j\):第\(j\)列上方连续为1的行数。

对于每一行\(i\),从大到小排序\(h\),并计算候选解:

x = [0,0,...,0]
foreach j, h[j]: # 从大到小遍历h[j]
  x[j] = 1
  ans = max(ans, (max(k : x[j..k]都为1) - min(k : x[k..j]都为1)) * h[j])

上面伪代码可以在\(O(n)\)时间内求出。方法是把\(x\)中设置为1的元素看成若干集合,相邻元素在同一个集合中。每次把某个\(x\)中元素设为1可以看成新建了一个集合,若左边或右边的集合存在则合并。

不相交集合可以用union-find算法,但针对这种特殊情形存在\(O(n)\)的算法:每个集合(即某个1的连续段)左端和右端互指,其他元素的指针任意。新建集合时若左边或右边的集合存在,则更新它们两端的指针。

#define ROF(i, a, b) for (int i = (b); --i >= (a); )
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define REP(i, n) for (int i = 0; i < (n); i++)
#define REP1(i, n) for (int i = 1; i <= (n); i++)

class Solution {
public:
  int maximalRectangle(vector<vector<char> > &a) {
    if (a.empty()) return 0;
    int m = a.size(), n = a[0].size(), ans = 0;
    vector<int> h(n), p(n), b(m+1), s(n);
    REP(i, m) {
      REP(j, n)
        h[j] = a[i][j] == '1' ? h[j]+1 : 0;
      fill(b.begin(), b.end(), 0);
      REP(j, n)
        b[h[j]]++;
      REP1(j, m)
        b[j] += b[j-1];
      REP(j, n)
        s[--b[h[j]]] = j;
      fill(p.begin(), p.end(), -1);
      ROF(j, 0, n) {
        int x = s[j], l = x, r = x;
        p[x] = x;
        if (x && p[x-1] != -1) {
          l = p[x-1];
          p[l] = x;
          p[x] = l;
        }
        if (x+1 < n && p[x+1] != -1) {
          l = p[x];
          r = p[x+1];
          p[l] = r;
          p[r] = l;
        }
        ans = max(ans, (r-l+1)*h[x]);
      }
    }
    return ans;
  }
};

栈维护histogram

逐行扫描棋盘,对于每一行记录\(h_j\):第\(j\)列上方连续为1的行数。

对于每一行\(i\),维护一个以\(h\)值为元素的栈,满足从栈底到栈顶\(h\)值递增。从左到右枚举各列\(j\),在插入\(h_j\)前维持栈性质,弹出元素后栈顶代表\(j\)往左能“看到”的最远位置,插入\(h_j\)。

其他方法 

枚举两列,求出夹在两列间的最大1子矩形。\(O(n^3)\)

令\(s_{i,j}\)表示以原矩形最上角和\((i,j)\)两个端点的矩形内1的数目,枚举所有子矩形\(((i,j),(ii,jj))\),用\(s_{ii,jj}-s_{ii,j-1}-s_{i-1,jj}+s_{i-1,j-1}\)求出这个子矩形内1的数目,判断是否合法。\(O(n^4)\)

把0看成障碍点,求不包含障碍点的最大子矩形。 把障碍点按横座标排序。枚举障碍点作为候选子矩形的左端,向右扫描各个障碍点,维护纵座标和枚举点最近的上下个一个障碍点。枚举点、扫描线和上下障碍点确定了候选子矩形的边界。 若0的数目为,\(O(m^2)\),最坏\(O(n^4)\)。

代码索引

#TitleSolution
1897Maximize Palindrome Length From Subsequencesmaximize-palindrome-length-from-subsequences.cc
1896Maximum Score from Performing Multiplication Operationsmaximum-score-from-performing-multiplication-operations.cc
1895Minimum Number of Operations to Move All Balls to Each Boxminimum-number-of-operations-to-move-all-balls-to-each-box.cc
1894Merge Strings Alternatelymerge-strings-alternately.cc
1876Map of Highest Peakmap-of-highest-peak.cc
1875Tree of Coprimestree-of-coprimes.cc
1874Form Array by Concatenating Subarrays of Another Arrayform-array-by-concatenating-subarrays-of-another-array.cc
916Decoded String at Indexdecoded-string-at-index.cc
830Largest Triangle Arealargest-triangle-area.cc
673Number of Longest Increasing Subsequencenumber-of-longest-increasing-subsequence.cc
635Design Log Storage Systemdesign-log-storage-system.cc
634Find the Derangement of An Arrayfind-the-derangement-of-an-array.cc
633Sum of Square Numberssum-of-square-numbers.cc
631Design Excel Sum Formuladesign-excel-sum-formula.cc
630Course Schedule IIIcourse-schedule-iii.cc
629K Inverse Pairs Arrayk-inverse-pairs-array.cc
628Maximum Product of Three Numbersmaximum-product-of-three-numbers.cc
617Merge Two Binary Treesmerge-two-binary-trees.cc
616Add Bold Tag in Stringadd-bold-tag-in-string.cc
611Valid Triangle Numbervalid-triangle-number.cc
604Design Compressed String Iteratordesign-compressed-string-iterator.cc
600Non-negative Integers without Consecutive Onesnon-negative-integers-without-consecutive-ones.cc
599Minimum Index Sum of Two Listsminimum-index-sum-of-two-lists.cc
598Range Addition IIrange-addition-ii.cc
594Longest Harmonious Subsequencelongest-harmonious-subsequence.cc
593Valid Squarevalid-square.cc
592Fraction Addition and Subtractionfraction-addition-and-subtraction.cc
588Design In-Memory File Systemdesign-in-memory-file-system.cc
587Erect the Fenceerect-the-fence.cc
583Delete Operation for Two Stringsdelete-operation-for-two-strings.cc
582Kill Processkill-process.cc
581Shortest Unsorted Continuous Subarrayshortest-unsorted-continuous-subarray.cc
575Distribute Candiesdistribute-candies.cc
565Array Nestingarray-nesting.cc
556Next Greater Element IIInext-greater-element-iii.cc
553Optimal Divisionoptimal-division.cc
552Student Attendance Record IIstudent-attendance-record-ii.cc
533Lonely Pixel IIlonely-pixel-ii.cc
531Lonely Pixel Ilonely-pixel-i.cc
514Freedom Trailfreedom-trail.cc
508Most Frequent Subtree Summost-frequent-subtree-sum.cc
507Perfect Numberperfect-number.cc
504Base 7base-7.cc
502IPOipo.cc
501Find Mode in Binary Search Treefind-mode-in-binary-search-tree.cc
500Keyboard Rowkeyboard-row.cc
495Teemo Attackingteemo-attacking.cc
494Target Sumtarget-sum.cc
491Increasing Subsequencesincreasing-subsequences.cc
490The Mazethe-maze.cc
485Max Consecutive Onesmax-consecutive-ones.cc
483Smallest Good Basesmallest-good-base.cc
482License Key Formattinglicense-key-formatting.cc
481Magical Stringmagical-string.cc
480Sliding Window Mediansliding-window-median.cc
477Total Hamming Distancetotal-hamming-distance.cc
476Number Complementnumber-complement.cc
475Heatersheaters.cc
474Ones and Zeroesones-and-zeroes.cc
473Matchsticks to Squarematchsticks-to-square.cc
472Concatenated Wordsconcatenated-words.cc
469Convex Polygonconvex-polygon.cc
468Validate IP Addressvalidate-ip-address.cc
467Unique Substrings in Wraparound Stringunique-substrings-in-wraparound-string.cc
466Count The Repetitionscount-the-repetitions.cc
465Optimal Account Balancingoptimal-account-balancing.cc
464Can I Wincan-i-win.cc
463Island Perimeterisland-perimeter.cc
462Minimum Moves to Equal Array Elements IIminimum-moves-to-equal-array-elements-ii.cc
461Hamming Distancehamming-distance.cc
459Repeated Substring Patternrepeated-substring-pattern.cc
456132 Pattern132-pattern.cc
455Assign Cookiesassign-cookies.cc
4544Sum II4sum-ii.cc
453Minimum Moves to Equal Array Elementsminimum-moves-to-equal-array-elements.cc
452Minimum Number of Arrows to Burst Balloonsminimum-number-of-arrows-to-burst-balloons.cc
447Number of Boomerangsnumber-of-boomerangs.cc
446Arithmetic Slices II - Subsequencearithmetic-slices-ii-subsequence.cc
444Sequence Reconstructionsequence-reconstruction.cc
441Arranging Coinsarranging-coins.cc
440K-th Smallest in Lexicographical Orderk-th-smallest-in-lexicographical-order.cc
439Ternary Expression Parserternary-expression-parser.cc
438Find All Anagrams in a Stringfind-all-anagrams-in-a-string.cc
437Path Sum IIIpath-sum-iii.cc
436Find Right Intervalfind-right-interval.cc
435Non-overlapping Intervalsnon-overlapping-intervals.cc
434Number of Segments in a Stringnumber-of-segments-in-a-string.cc
432All O`one Data Structureall-oone-data-structure.cc
424Longest Repeating Character Replacementlongest-repeating-character-replacement.cc
423Reconstruct Original Digits from Englishreconstruct-original-digits-from-english.cc
422Valid Word Squarevalid-word-square.cc
421Maximum XOR of Two Numbers in an Arraymaximum-xor-of-two-numbers-in-an-array.cc
420Strong Password Checkerstrong-password-checker.cc
419Battleships in a Boardbattleships-in-a-board.cc
417Pacific Atlantic Water Flowpacific-atlantic-water-flow.cc
416Partition Equal Subset Sumpartition-equal-subset-sum.cc
415Add Stringsadd-strings.cc
414Third Maximum Numberthird-maximum-number.cc
413Arithmetic Slicesarithmetic-slices.cc
412Fizz Buzzfizz-buzz.cc
410Split Array Largest Sumsplit-array-largest-sum.cc
409Longest Palindromelongest-palindrome.cc
408Valid Word Abbreviationvalid-word-abbreviation.cc
407Trapping Rain Water IItrapping-rain-water-ii.cc
406Queue Reconstruction by Heightqueue-reconstruction-by-height.cc
405Convert a Number to Hexadecimalconvert-a-number-to-hexadecimal.cc
404Sum of Left Leavessum-of-left-leaves.cc
403Frog Jumpfrog-jump.cc
402Remove K Digitsremove-k-digits.cc
401Binary Watchbinary-watch.cc
400Nth Digitnth-digit.cc
399Evaluate Divisionevaluate-division.cc
398Random Pick Indexrandom-pick-index.cc
397Integer Replacementinteger-replacement.cc
396Rotate Functionrotate-function.cc
395Longest Substring with At Least K Repeating Characterslongest-substring-with-at-least-k-repeating-characters.cc
394Decode Stringdecode-string.cc
393UTF-8 Validationutf-8-validation.cc
392Is Subsequenceis-subsequence.cc
391Perfect Rectangleperfect-rectangle.cc
390Elimination Gameelimination-game.cc
389Find the Differencefind-the-difference.cc
388Longest Absolute File Pathlongest-absolute-file-path.cc
387First Unique Character in a Stringfirst-unique-character-in-a-string.cc
386Lexicographical Numberslexicographical-numbers.cc
385Mini Parsermini-parser.cc
384Shuffle an Arrayshuffle-an-array.cc
383Ransom Noteransom-note.cc
382Linked List Random Nodelinked-list-random-node.cc
381Insert Delete GetRandom O(1) - Duplicates allowedinsert-delete-getrandom-o1-duplicates-allowed.cc
380Insert Delete GetRandom O(1)insert-delete-getrandom-o1.cc
379Design Phone Directorydesign-phone-directory.cc
378Kth Smallest Element in a Sorted Matrixkth-smallest-element-in-a-sorted-matrix.cc
377Combination Sum IVcombination-sum-iv.cc
376Wiggle Subsequencewiggle-subsequence.cc
375Guess Number Higher or Lower IIguess-number-higher-or-lower-ii.cc
374Guess Number Higher or Lowerguess-number-higher-or-lower.cc
373Find K Pairs with Smallest Sumsfind-k-pairs-with-smallest-sums.cc
372Super Powsuper-pow.cc
371Sum of Two Integerssum-of-two-integers.cc
370Range Additionrange-addition.cc
369Plus One Linked Listplus-one-linked-list.cc
368Largest Divisible Subsetlargest-divisible-subset.cc
367Valid Perfect Squarevalid-perfect-square.cc
366Find Leaves of Binary Treefind-leaves-of-binary-tree.cc
365Water and Jug Problemwater-and-jug-problem.cc
364Nested List Weight Sum IInested-list-weight-sum-ii.cc
362Design Hit Counterdesign-hit-counter.cc
361Bomb Enemybomb-enemy.cc
360Sort Transformed Arraysort-transformed-array.cc
359Logger Rate Limiterlogger-rate-limiter.cc
358Rearrange String k Distance Apartrearrange-string-k-distance-apart.cc
357Count Numbers with Unique Digitscount-numbers-with-unique-digits.cc
356Line Reflectionline-reflection.cc
355Design Twitterdesign-twitter.cc
354Russian Doll Envelopesrussian-doll-envelopes.cc
353Design Snake Gamedesign-snake-game.cc
352Data Stream as Disjoint Intervalsdata-stream-as-disjoint-intervals.cc
351Android Unlock Patternsandroid-unlock-patterns.cc
350Intersection of Two Arrays IIintersection-of-two-arrays-ii.cc
349Intersection of Two Arraysintersection-of-two-arrays.cc
348Design Tic-Tac-Toedesign-tic-tac-toe.cc
347Top K Frequent Elementstop-k-frequent-elements.cc
346Moving Average from Data Streammoving-average-from-data-stream.cc
345Reverse Vowels of a Stringreverse-vowels-of-a-string.cc
344Reverse Stringreverse-string.cc
343Integer Breakinteger-break.cc
342Power of Fourpower-of-four.cc
341Flatten Nested List Iteratorflatten-nested-list-iterator.cc
340Longest Substring with At Most K Distinct Characterslongest-substring-with-at-most-k-distinct-characters.cc
339Nested List Weight Sumnested-list-weight-sum.cc
338Counting Bitscounting-bits.cc
337House Robber IIIhouse-robber-iii.cc
336Palindrome Pairspalindrome-pairs.cc
335Self Crossingself-crossing.cc
334Increasing Triplet Subsequenceincreasing-triplet-subsequence.cc
333Largest BST Subtreelargest-bst-subtree.cc
332Reconstruct Itineraryreconstruct-itinerary.cc
331Verify Preorder Serialization of a Binary Treeverify-preorder-serialization-of-a-binary-tree.cc
330Patching Arraypatching-array.cc
329Longest Increasing Path in a Matrixlongest-increasing-path-in-a-matrix.cc
328Odd Even Linked Listodd-even-linked-list.cc
327Count of Range Sumcount-of-range-sum.cc
326Power of Threepower-of-three.cc
325Maximum Size Subarray Sum Equals kmaximum-size-subarray-sum-equals-k.cc
324Wiggle Sort IIwiggle-sort-ii.cc
323Number of Connected Components in an Undirected Graphnumber-of-connected-components-in-an-undirected-graph.cc
322Coin Changecoin-change.cc
321Create Maximum Numbercreate-maximum-number.cc
320Generalized Abbreviationgeneralized-abbreviation.cc
319Bulb Switcherbulb-switcher.cc
318Maximum Product of Word Lengthsmaximum-product-of-word-lengths.cc
317Shortest Distance from All Buildingsshortest-distance-from-all-buildings.cc
316Remove Duplicate Lettersremove-duplicate-letters.cc
315Count of Smaller Numbers After Selfcount-of-smaller-numbers-after-self.cc
314Binary Tree Vertical Order Traversalbinary-tree-vertical-order-traversal.cc
313Super Ugly Numbersuper-ugly-number.cc
312Burst Balloonsburst-balloons.cc
311Sparse Matrix Multiplicationsparse-matrix-multiplication.cc
310Minimum Height Treesminimum-height-trees.cc
309Best Time to Buy and Sell Stock with Cooldownbest-time-to-buy-and-sell-stock-with-cooldown.cc
308Range Sum Query 2D - Mutablerange-sum-query-2d-mutable.cc
307Range Sum Query - Mutablerange-sum-query-mutable.cc
306Additive Numberadditive-number.cc
305Number of Islands IInumber-of-islands-ii.cc
304Range Sum Query 2D - Immutablerange-sum-query-2d-immutable.cc
303Range Sum Query - Immutablerange-sum-query-immutable.cc
302Smallest Rectangle Enclosing Black Pixelssmallest-rectangle-enclosing-black-pixels.cc
301Remove Invalid Parenthesesremove-invalid-parentheses.cc
300Longest Increasing Subsequencelongest-increasing-subsequence.cc
299Bulls and Cowsbulls-and-cows.cc
298Binary Tree Longest Consecutive Sequencebinary-tree-longest-consecutive-sequence.cc
297Serialize and Deserialize Binary Treeserialize-and-deserialize-binary-tree.cc
296Best Meeting Pointbest-meeting-point.cc
295Find Median from Data Streamfind-median-from-data-stream.cc
294Flip Game IIflip-game-ii.cc
293Flip Gameflip-game.cc
292Nim Gamenim-game.cc
291Word Pattern IIword-pattern-ii.cc
290Word Patternword-pattern.cc
289Game of Lifegame-of-life.cc
288Unique Word Abbreviationunique-word-abbreviation.cc
287Find the Duplicate Numberfind-the-duplicate-number.cc
286Walls and Gateswalls-and-gates.cc
285Inorder Successor in BSTinorder-successor-in-bst.cc
284Peeking Iteratorpeeking-iterator.cc
283Move Zeroesmove-zeroes.cc
282Expression Add Operatorsexpression-add-operators.cc
281Zigzag Iteratorzigzag-iterator.cc
280Wiggle Sortwiggle-sort.cc
279Perfect Squaresperfect-squares.cc
278First Bad Versionfirst-bad-version.cc
277Find the Celebrityfind-the-celebrity.cc
276Paint Fencepaint-fence.cc
275H-Index IIh-index-ii.cc
274H-Indexh-index.cc
273Integer to English Wordsinteger-to-english-words.cc
272Closest Binary Search Tree Value IIclosest-binary-search-tree-value-ii.cc
271Encode and Decode Stringsencode-and-decode-strings.cc
270Closest Binary Search Tree Valueclosest-binary-search-tree-value.cc
269Alien Dictionaryalien-dictionary.cc
268Missing Numbermissing-number.cc
267Palindrome Permutation IIpalindrome-permutation-ii.cc
266Palindrome Permutationpalindrome-permutation.cc
265Paint House IIpaint-house-ii.cc
264Ugly Number IIugly-number-ii.cc
263Ugly Numberugly-number.cc
261Graph Valid Treegraph-valid-tree.cc
260Single Number IIIsingle-number-iii.cc
2593Sum Smaller3sum-smaller.cc
258Add Digitsadd-digits.cc
257Binary Tree Pathsbinary-tree-paths.cc
256Paint Housepaint-house.cc
255Verify Preorder Sequence in Binary Search Treeverify-preorder-sequence-in-binary-search-tree.cc
254Factor Combinationsfactor-combinations.cc
253Meeting Rooms IImeeting-rooms-ii.cc
252Meeting Roomsmeeting-rooms.cc
251Flatten 2D Vectorflatten-2d-vector.cc
250Count Univalue Subtreescount-univalue-subtrees.cc
249Group Shifted Stringsgroup-shifted-strings.cc
248Strobogrammatic Number IIIstrobogrammatic-number-iii.cc
247Strobogrammatic Number IIstrobogrammatic-number-ii.cc
246Strobogrammatic Numberstrobogrammatic-number.cc
245Shortest Word Distance IIIshortest-word-distance-iii.cc
244Shortest Word Distance IIshortest-word-distance-ii.cc
243Shortest Word Distanceshortest-word-distance.cc
242Valid Anagramvalid-anagram.cc
241Different Ways to Add Parenthesesdifferent-ways-to-add-parentheses.cc
240Search a 2D Matrix IIsearch-a-2d-matrix-ii.cc
239Sliding Window Maximumsliding-window-maximum.cc
238Product of Array Except Selfproduct-of-array-except-self.cc
237Delete Node in a Linked Listdelete-node-in-a-linked-list.cc
236Lowest Common Ancestor of a Binary Treelowest-common-ancestor-of-a-binary-tree.cc
235Lowest Common Ancestor of a Binary Search Treelowest-common-ancestor-of-a-binary-search-tree.cc
234Palindrome Linked Listpalindrome-linked-list.cc
233Number of Digit Onenumber-of-digit-one.cc
232Implement Queue using Stacksimplement-queue-using-stacks.cc
231Power of Twopower-of-two.cc
230Kth Smallest Element in a BSTkth-smallest-element-in-a-bst.cc
229Majority Element IImajority-element-ii.cc
228Summary Rangessummary-ranges.cc
227Basic Calculator IIbasic-calculator-ii.cc
226Invert Binary Treeinvert-binary-tree.cc
225Implement Stack using Queuesimplement-stack-using-queues.cc
224Basic Calculatorbasic-calculator.cc
223Rectangle Arearectangle-area.cc
222Count Complete Tree Nodescount-complete-tree-nodes.cc
221Maximal Squaremaximal-square.cc
220Contains Duplicate IIIcontains-duplicate-iii.cc
219Contains Duplicate IIcontains-duplicate-ii.cc
218The Skyline Problemthe-skyline-problem.cc
217Contains Duplicatecontains-duplicate.cc
216Combination Sum IIIcombination-sum-iii.cc
215Kth Largest Element in an Arraykth-largest-element-in-an-array.cc
214Shortest Palindromeshortest-palindrome.cc
213House Robber IIhouse-robber-ii.cc
212Word Search IIword-search-ii.cc
210Course Schedule IIcourse-schedule-ii.cc
209Minimum Size Subarray Summinimum-size-subarray-sum.cc
208Implement Trie (Prefix Tree)implement-trie-prefix-tree.cc
207Course Schedulecourse-schedule.cc
206Reverse Linked Listreverse-linked-list.cc
205Isomorphic Stringsisomorphic-strings.cc
204Count Primescount-primes.cc
203Remove Linked List Elementsremove-linked-list-elements.cc
202Happy Numberhappy-number.cc
201Bitwise AND of Numbers Rangebitwise-and-of-numbers-range.cc
200Number of Islandsnumber-of-islands.cc
199Binary Tree Right Side Viewbinary-tree-right-side-view.cc
198House Robberhouse-robber.cc
191Number of 1 Bitsnumber-of-1-bits.cc
190Reverse Bitsreverse-bits.cc
189Rotate Arrayrotate-array.cc
188Best Time to Buy and Sell Stock IVbest-time-to-buy-and-sell-stock-iv.cc
187Repeated DNA Sequencesrepeated-dna-sequences.cc
186Reverse Words in a String IIreverse-words-in-a-string-ii.cc
179Largest Numberlargest-number.cc
174Dungeon Gamedungeon-game.cc
173Binary Search Tree Iteratorbinary-search-tree-iterator.cc
172Factorial Trailing Zeroesfactorial-trailing-zeroes.cc
171Excel Sheet Column Numberexcel-sheet-column-number.cc
170Two Sum III - Data structure designtwo-sum-iii-data-structure-design.cc
169Majority Elementmajority-element.cc
168Excel Sheet Column Titleexcel-sheet-column-title.cc
167Two Sum II - Input array is sortedtwo-sum-ii-input-array-is-sorted.cc
166Fraction to Recurring Decimalfraction-to-recurring-decimal.cc
165Compare Version Numberscompare-version-numbers.cc
164Maximum Gapmaximum-gap.cc
163Missing Rangesmissing-ranges.cc
162Find Peak Elementfind-peak-element.cc
161One Edit Distanceone-edit-distance.cc
160Intersection of Two Linked Listsintersection-of-two-linked-lists.cc
159Longest Substring with At Most Two Distinct Characterslongest-substring-with-at-most-two-distinct-characters.cc
158Read N Characters Given Read4 II - Call multiple timesread-n-characters-given-read4-ii-call-multiple-times.cc
157Read N Characters Given Read4read-n-characters-given-read4.cc
156Binary Tree Upside Downbinary-tree-upside-down.cc
155Min Stackmin-stack.cc
154Find Minimum in Rotated Sorted Array IIfind-minimum-in-rotated-sorted-array-ii.cc
153Find Minimum in Rotated Sorted Arrayfind-minimum-in-rotated-sorted-array.cc
152Maximum Product Subarraymaximum-product-subarray.cc
151Reverse Words in a Stringreverse-words-in-a-string.cc
150Evaluate Reverse Polish Notationevaluate-reverse-polish-notation.cc
149Max Points on a Linemax-points-on-a-line.cc
148Sort Listsort-list.cc
147Insertion Sort Listinsertion-sort-list.cc
146LRU Cachelru-cache.cc
145Binary Tree Postorder Traversalbinary-tree-postorder-traversal.cc
144Binary Tree Preorder Traversalbinary-tree-preorder-traversal.cc
143Reorder Listreorder-list.cc
142Linked List Cycle IIlinked-list-cycle-ii.cc
141Linked List Cyclelinked-list-cycle.cc
140Word Break IIword-break-ii.cc
139Word Breakword-break.cc
138Copy List with Random Pointercopy-list-with-random-pointer.cc
137Single Number IIsingle-number-ii.cc
136Single Numbersingle-number.cc
135Candycandy.cc
134Gas Stationgas-station.cc
133Clone Graphclone-graph.cc
132Palindrome Partitioning IIpalindrome-partitioning-ii.cc
131Palindrome Partitioningpalindrome-partitioning.cc
130Surrounded Regionssurrounded-regions.cc
129Sum Root to Leaf Numberssum-root-to-leaf-numbers.cc
128Longest Consecutive Sequencelongest-consecutive-sequence.cc
127Word Ladderword-ladder.cc
126Word Ladder IIword-ladder-ii.cc
125Valid Palindromevalid-palindrome.cc
124Binary Tree Maximum Path Sumbinary-tree-maximum-path-sum.cc
123Best Time to Buy and Sell Stock IIIbest-time-to-buy-and-sell-stock-iii.cc
122Best Time to Buy and Sell Stock IIbest-time-to-buy-and-sell-stock-ii.cc
121Best Time to Buy and Sell Stockbest-time-to-buy-and-sell-stock.cc
120Triangletriangle.cc
119Pascal's Triangle IIpascals-triangle-ii.cc
118Pascal's Trianglepascals-triangle.cc
117Populating Next Right Pointers in Each Node IIpopulating-next-right-pointers-in-each-node-ii.cc
116Populating Next Right Pointers in Each Nodepopulating-next-right-pointers-in-each-node.cc
115Distinct Subsequencesdistinct-subsequences.cc
114Flatten Binary Tree to Linked Listflatten-binary-tree-to-linked-list.cc
113Path Sum IIpath-sum-ii.cc
112Path Sumpath-sum.cc
111Minimum Depth of Binary Treeminimum-depth-of-binary-tree.cc
110Balanced Binary Treebalanced-binary-tree.cc
109Convert Sorted List to Binary Search Treeconvert-sorted-list-to-binary-search-tree.cc
108Convert Sorted Array to Binary Search Treeconvert-sorted-array-to-binary-search-tree.cc
107Binary Tree Level Order Traversal IIbinary-tree-level-order-traversal-ii.cc
106Construct Binary Tree from Inorder and Postorder Traversalconstruct-binary-tree-from-inorder-and-postorder-traversal.cc
105Construct Binary Tree from Preorder and Inorder Traversalconstruct-binary-tree-from-preorder-and-inorder-traversal.cc
104Maximum Depth of Binary Treemaximum-depth-of-binary-tree.cc
103Binary Tree Zigzag Level Order Traversalbinary-tree-zigzag-level-order-traversal.cc
102Binary Tree Level Order Traversalbinary-tree-level-order-traversal.cc
101Symmetric Treesymmetric-tree.cc
100Same Treesame-tree.cc
99Recover Binary Search Treerecover-binary-search-tree.cc
98Validate Binary Search Treevalidate-binary-search-tree.cc
97Interleaving Stringinterleaving-string.cc
96Unique Binary Search Treesunique-binary-search-trees.cc
95Unique Binary Search Trees IIunique-binary-search-trees-ii.cc
94Binary Tree Inorder Traversalbinary-tree-inorder-traversal.cc
93Restore IP Addressesrestore-ip-addresses.cc
92Reverse Linked List IIreverse-linked-list-ii.cc
91Decode Waysdecode-ways.cc
90Subsets IIsubsets-ii.cc
89Gray Codegray-code.cc
88Merge Sorted Arraymerge-sorted-array.cc
87Scramble Stringscramble-string.cc
86Partition Listpartition-list.cc
85Maximal Rectanglemaximal-rectangle.cc
84Largest Rectangle in Histogramlargest-rectangle-in-histogram.cc
83Remove Duplicates from Sorted Listremove-duplicates-from-sorted-list.cc
82Remove Duplicates from Sorted List IIremove-duplicates-from-sorted-list-ii.cc
81Search in Rotated Sorted Array IIsearch-in-rotated-sorted-array-ii.cc
80Remove Duplicates from Sorted Array IIremove-duplicates-from-sorted-array-ii.cc
79Word Searchword-search.cc
78Subsetssubsets.cc
77Combinationscombinations.cc
76Minimum Window Substringminimum-window-substring.cc
75Sort Colorssort-colors.cc
74Search a 2D Matrixsearch-a-2d-matrix.cc
73Set Matrix Zeroesset-matrix-zeroes.cc
72Edit Distanceedit-distance.cc
71Simplify Pathsimplify-path.cc
70Climbing Stairsclimbing-stairs.cc
69Sqrt(x)sqrtx.cc
68Text Justificationtext-justification.cc
67Add Binaryadd-binary.cc
66Plus Oneplus-one.cc
65Valid Numbervalid-number.cc
64Minimum Path Summinimum-path-sum.cc
63Unique Paths IIunique-paths-ii.cc
62Unique Pathsunique-paths.cc
61Rotate Listrotate-list.cc
60Permutation Sequencepermutation-sequence.cc
59Spiral Matrix IIspiral-matrix-ii.cc
58Length of Last Wordlength-of-last-word.cc
57Insert Intervalinsert-interval.cc
56Merge Intervalsmerge-intervals.cc
55Jump Gamejump-game.cc
54Spiral Matrixspiral-matrix.cc
53Maximum Subarraymaximum-subarray.cc
52N-Queens IIn-queens-ii.cc
51N-Queensn-queens.cc
50Pow(x, n)powx-n.cc
48Rotate Imagerotate-image.cc
47Permutations IIpermutations-ii.cc
46Permutationspermutations.cc
45Jump Game IIjump-game-ii.cc
44Wildcard Matchingwildcard-matching.cc
43Multiply Stringsmultiply-strings.cc
42Trapping Rain Watertrapping-rain-water.cc
41First Missing Positivefirst-missing-positive.cc
40Combination Sum IIcombination-sum-ii.cc
39Combination Sumcombination-sum.cc
38Count and Saycount-and-say.cc
37Sudoku Solversudoku-solver.cc
36Valid Sudokuvalid-sudoku.cc
35Search Insert Positionsearch-insert-position.cc
33Search in Rotated Sorted Arraysearch-in-rotated-sorted-array.cc
32Longest Valid Parentheseslongest-valid-parentheses.cc
31Next Permutationnext-permutation.cc
30Substring with Concatenation of All Wordssubstring-with-concatenation-of-all-words.cc
29Divide Two Integersdivide-two-integers.cc
28Implement strStr()implement-strstr.cc
27Remove Elementremove-element.cc
26Remove Duplicates from Sorted Arrayremove-duplicates-from-sorted-array.cc
25Reverse Nodes in k-Groupreverse-nodes-in-k-group.cc
24Swap Nodes in Pairsswap-nodes-in-pairs.cc
23Merge k Sorted Listsmerge-k-sorted-lists.cc
22Generate Parenthesesgenerate-parentheses.cc
21Merge Two Sorted Listsmerge-two-sorted-lists.cc
20Valid Parenthesesvalid-parentheses.cc
19Remove Nth Node From End of Listremove-nth-node-from-end-of-list.cc
184Sum4sum.cc
17Letter Combinations of a Phone Numberletter-combinations-of-a-phone-number.cc
163Sum Closest3sum-closest.cc
153Sum3sum.cc
14Longest Common Prefixlongest-common-prefix.cc
13Roman to Integerroman-to-integer.cc
12Integer to Romaninteger-to-roman.cc
11Container With Most Watercontainer-with-most-water.cc
10Regular Expression Matchingregular-expression-matching.cc
9Palindrome Numberpalindrome-number.cc
8String to Integer (atoi)string-to-integer-atoi.cc
7Reverse Integerreverse-integer.cc
6ZigZag Conversionzigzag-conversion.cc
5Longest Palindromic Substringlongest-palindromic-substring.cc
4Median of Two Sorted Arraysmedian-of-two-sorted-arrays.cc
3Longest Substring Without Repeating Characterslongest-substring-without-repeating-characters.cc
2Add Two Numbersadd-two-numbers.cc
1Two Sumtwo-sum.cc
copy($('td:has(.ac) ~ td:nth-child(3) a').map(function(_,e){
  var id = $(e).parent().prev().text();
  var h=e.href.replace(/htt.*problems/,'/leetcode');h=h.substr(0,h.length-1);
  var title=e.textContent, href=e.href, name=h.replace(/.*\//,'');
  return '|'+id+'|['+title+']('+href+')|['+name+'.cc]('+name+'.cc)|'
}).toArray().join('\n'))
require 'mechanize'
agent = Mechanize.new
page = agent.get 'https://leetcode.com/accounts/login/'
doc = page.form_with {|form|
  form['login'] = 'MaskRay'
  form['password'] = getpass
}.submit.parser
total = doc.css('td:nth-child(3)').size
solved = doc.css('td:has(.ac)').size
puts "You have solved #{solved}/#{total} problems."
for a in doc.css('td:nth-child(3) a')
  id = a.parent.previous_element.text
  href = a['href']
  name = href.sub(/\/problems\/(.*)\//, '\1')
  title = a.text
  puts "|#{id}|[#{title}](#{href})|[#{name}.cc](#{name}.cc)|"
end