LeetCode 简略题解 - 301~400

#301 Remove Invalid Parentheses

// #301 去除无效括号

描述:给定一个可能包含其他字符的括号序列,通过删除最少的字符,使括号成功匹配。要求返回所有可行的解法。

// Description: Remove Invalid Parentheses | LeetCode OJ

解法1:难题。试想,如果多出了),我们如何处理?没错,删掉。那么多出了(,怎么办呢?能删吗?不能,因为后面可能用得着。这就是一大难点。要求返回所有结果,这是另一大难点。为了处理这两点,我的代码写得非常繁琐,而且始终没通过。最终找了网上的解法,发现其中有一个绝妙的解法:对于多余的(,我们把问题反过来看。看看代码,你就知道怎么“反”了。

// Solution 1: A hard problem indeed. If there're redundant (s, what you gonna do? Remove it. If it's )s, what then? We can't remove them, because they might be needed later. This is the first challenge. The problem requests we find all possible solutions, that's the second challenge. It took me lots of time and efforts to put up a long and sloppy solution, which never got accepted. Here the solution is from the Internet. A major difference from mine is the way it deals with redundant (s: switch the role of () to )(. Read the code and you'll see how and why.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#302 Smallest Rectangle Enclosing Black Pixels

// #302 包围黑点的最小矩形

描述:给定一个01矩阵,1表示黑点。求能盖住所有黑点的最小矩形面积。

// Description: Smallest Rectangle Enclosing Black Pixels | LeetCode OJ

解法1:无聊。

// Solution 1: Boring.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110

解法2:真无聊。

// Solution 2: Really boring.

代码2:github.com/zhuli1990110

// Code 2: github.com/zhuli1990110



#303 Range Sum Query - Immutable

// #303 区间求和 - 不变

描述:给定一个元素不变的数组,处理多次区间求和。

// Description: Range Sum Query - Immutable | LeetCode OJ

解法1:前缀和。

// Solution 1: Prefix sum.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#304 Range Sum Query 2D - Immutable

// #304 二维区间求和 - 不变

描述:给定元素不变的矩阵,求各种子矩阵和。

// Description: Range Sum Query 2D - Immutable | LeetCode OJ

解法1:还是前缀和。

// Solution 1: Still prefix sum.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#305 Number of Islands II

// #305 岛屿个数2

描述:给定一个01矩阵,开始全都是0。允许两种操作:1. 查询“1”连通分量的个数,2. 把某位置变成1。

// Description: Number of Islands II | LeetCode OJ

解法1:并查集。

// Solution 1: Union-find set.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#306 Additive Number

// #306 加性数

描述:斐波那契数列知道吧?现在给定这么一个数列,开头俩数可以不是1,把这个数列连成一个数,我们称其为“加性数”。现在给定一个数,判断是不是加性数。

// Description: Additive Number | LeetCode OJ

解法1:一看就得搜,不过要注意剪枝,否则妥妥的药丸。

// Solution 1: It looks like DFS, but make sure you got some pruning in stock. Otherwise, you're going down.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#307 Range Sum Query - Mutable

// #307 区间求和 - 可变

描述:给定允许改变元素的数组,处理各种区间求和。

// Description: Range Sum Query - Mutable | LeetCode OJ

解法1:树状数组。

// Solution 1: BIT.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#308 Range Sum Query 2D - Mutable

// #308 二维区间求和 - 可变

描述:给定元素可变的矩阵,处理子矩阵求和。

// Description: Range Sum Query 2D - Mutable | LeetCode OJ

解法1:二维树状数组。

// Solution 1: 2D BIT.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#309 Best Time to Buy and Sell Stock with Cooldown

// #309 最佳炒股时机带CD

描述:给定股价,每次买卖股票有1天的冷却期,求最大收益。

// Description: Best Time to Buy and Sell Stock with Cooldown | LeetCode OJ

解法1:用一个有限状态机来考虑,昨天今天、有股没股。这两者的组合和状态转换搞清楚了,题目就做出来了。

// Solution 1: Use a finite state machine to deal with the problem. Today or yesterday, got stocks in hand or not, the state transitions among these are the key to the solution.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#310 Minimum Height Trees

// #310 最小高度树

描述:给定一个树形的无向图,允许你选一个节点作为根。请找出使得树最矮的根节点。

// Description: Minimum Height Trees | LeetCode OJ

解法1:关键在于找出图中最长的一条路径。做法就是两次遍历。这条最长的路径也叫作图的直径。

// Solution 1: The key is to find the longest path in the graph. Two traversals will suffice. This path is called the diameter of the graph.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#311 Sparse Matrix Multiplication

// #311 稀疏矩阵相乘

描述:给定两个很稀疏的矩阵,做乘法。

// Description: leetcode.com/problems/s

解法1:很稀疏,有多稀疏?你输入是完整矩阵,输出也是,有谋搞错?

// Solution 1: Sparse matrix? I don't see no sparse matrix.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#312 Burst Balloons

// #312 爆气球

描述:给定n个气球排成一排,每个上面标了个数a[i]。如果爆掉某个气球,就获得左右俩球和该球的乘积作为奖分,之后左右俩球就相邻了。求爆掉所有气球获得的最高得分。

// Description: Burst Balloons | LeetCode OJ

解法1:记忆化搜索,动态规划的常见玩法。

// Solution 1: DFS with memorization, a common feat in DP.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#313 Super Ugly Number

// #313 超级丑数

描述:和之前一样,不过这次的质数是由输入钦点,不一定是2、3、5。求第n个。

// Description: Super Ugly Number | LeetCode OJ

解法1:看代码。

// Solution 1: Read the code.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#314 Binary Tree Vertical Order Traversal

// #314 二叉树垂直遍历

描述:按照从左往右,从上往下的顺序,遍历二叉树。

// Description: Binary Tree Vertical Order Traversal | LeetCode OJ

解法1:我倒看看你还有多少种遍历方式。

// Solution 1: Show me what you got on binary tree traversals.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#315 Count of Smaller Numbers After Self

// #315 后面小于自身的元素个数

描述:给定一个数组,对于每个元素,求在其后比其小的元素个数。

// Description: Count of Smaller Numbers After Self | LeetCode OJ

解法1:凡是这种限定数据范围、下标范围,统计个数的问题,都可以用树状数组来做。必要时可以用哈希表对离散化的数据进行连续化映射。

// Solution 1: Problems as such, that put restrictions on data range and index range and focus on counting, can be solved with BIT. Use a hash table to map a discretized sequence to a consecutive one.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#316 Remove Duplicate Letters

// #316 去除重复字母

描述:给定一个字符串,去除重复字母,使得所有字母只出现一次,并要求所得结果是字典序最小的。

// Description: Remove Duplicate Letters | LeetCode OJ

解法1:贪婪。

// Solution 1: Greed is good.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#317 Shortest Distance from All Buildings

// #317 最短距离之和

描述:和之前那一样,不过这次建筑物不能穿过了,而且还有一些障碍物也不能穿过。依然求最短距离之和。如果找不到,返回-1。

// Description: Shortest Distance from All Buildings | LeetCode OJ

解法1:因为涉及到连通性,简单的求和就不管用了。搜吧。

// Solution 1: Since connectivity problem is involved, simple summation no longer works. Let's search.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#318 Maximum Product of Word Lengths

// #318 单词长度最大乘积

描述:给定一堆单词,要求找出俩单词长度的最大乘积,要求俩单词不能有相同字母。

// Description: Maximum Product of Word Lengths | LeetCode OJ

解法1:对于如何判断俩单词有没有相同字母,只要用位向量表示每个字母是否出现即可,俩位向量异或即可得出是否有相同字母。

// Solution 1: Use a bit vector to mark the occurrence of each letter. The XOR of two bit vectors will reveal if two words share a same letter.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#319 Bulb Switcher

// #319 开关灯

描述:有N盏灯,开始都关着。从1到N,数到K时,就把所有K的倍数的开关都按一次。如此N轮后,问有多少盏灯亮着。

// Description: Bulb Switcher | LeetCode OJ

解法1:这是个数学题。

// Solution 1: It's about math.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#320 Generalized Abbreviation

// #320 缩写(广义的)

描述:定义一种广义的缩写:允许你把一个单词中的一个或多个部分替换成长度,但各部分不能相邻。给定一个单词,给出所有可能的替换方法。

// Description: leetcode.com/problems/g

解法1:搜。

// Solution 1: DFS.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#321 Create Maximum Number

// #321 构成最大数

描述:给定俩长度为m和n的数组,元素全都是0~9数字。现要求从中选出k个数字,组成最大的数。要求选数的过程保持俩数组中元素的各自先后顺序。

// Description: Create Maximum Number | LeetCode OJ

解法1:这很像归并排序,对吧?不过没那么简单,因为有些元素是要跳过的。仔细看dropOne()函数的作用,就会发现其作用是每次舍弃一个数字,使得结果尽可能大。我们之后的归并则是通过comp()保证结果尽可能大。两者配合,得到最终结果。

// Solution 1: It's like Merge Sort, right? Ain't that simple, because some digits are to be discarded. Read the function dropOne() carefully and you'll find it drops one digit to make the result as large as possible. The largest merge result is guaranteed by comp(). Use'em both, you'll get the correct result.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#322 Coin Change

// #322 找零钱

描述:给你足够多的几种面值的钱,问最少用几张能凑出某个金额。

// Description: Coin Change | LeetCode OJ

解法1:背包问题。

// Solution 1: Knapsack Problem.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#323 Number of Connected Components in an Undirected Graph

// #323 无向图连通分量个数

描述:如题。

// Description: Number of Connected Components in an Undirected Graph | LeetCode OJ

解法1:并查集。

// Solution 1: Union-find set.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#324 Wiggle Sort II

// #324 摇摆排序2

描述:和之前一样,但这次要求相邻元素不能相等。

// Description: Wiggle Sort II | LeetCode OJ

解法1:O(1)的空间复杂度还是算了,有功夫我还多睡会儿,操这闲心干嘛?

// Solution 1: O(1) space? Forget about it.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#325 Maximum Size Subarray Sum Equals k

// #325 和为k的最长子数组

描述:给定数组,求和为k的最长子数组的长度。

// Description: Maximum Size Subarray Sum Equals k | LeetCode OJ

解法1:用哈希表记录前缀和。

// Solution 1: Record prefix sums with a hash table.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#326 Power of Three

// #326 3的幂

描述:判断一个数是否是3的幂。

// Description: Power of Three | LeetCode OJ

解法1:循环。

// Solution 1: Loop.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110

解法2:对数。

// Solution 2: Logarithm.

代码2:github.com/zhuli1990110

// Code 2: github.com/zhuli1990110



#327 Count of Range Sum

// #327 统计区间和

描述:给定一个数组,求有多少区间和在[low, high]之间。

// Description: Count of Range Sum | LeetCode OJ

解法1:参考Count of Smaller Number After Self,用树状数组搞定。想想1和-1是干嘛用的。

// Solution 1: Refer to the solution of Count of Smaller Number After Self. Use a BIT and think about the meaning of 1 and -1.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#328 Odd Even Linked List

// #328 奇偶链表

描述:给定一个链表,按照单双数位置把链表重排成单在前,双在后。注意,是位置,不是值。

// Description: Odd Even Linked List | LeetCode OJ

解法1:水题。

// Solution 1: Easy.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#329 Longest Increasing Path in a Matrix

// #329 矩阵最长递增路径

描述:给定一个矩阵,允许从某点出发,上下左右走。请找出能走出的单调递增序列的最大长度。

// Description: Longest Increasing Path in a Matrix | LeetCode OJ

解法1:可以搜,也可以DP,道理其实是一样的。

// Solution 1: BFS or DP, different means, same goal.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#330 Patching Array

// #330 数组补丁

描述:给定一个数组和一个值target,允许你添加一些数,使得数组中的数能加成target。问最少添加多少个数?

// Description: Patching Array | LeetCode OJ

解法1:代码非常短,思路却很聪明。贪婪。

// Solution 1: Very short code and bright idea. It's greedy.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#331 Verify Preorder Serialization of a Binary Tree

// #331 验证二叉树前序序列化

描述:给定一个前序遍历的序列化字符串,判断其是否能够成一棵有效地二叉树。

// Description: Verify Preorder Serialization of a Binary Tree | LeetCode OJ

解法1:水题。

// Solution 1: Easy.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#332 Reconstruct Itinerary

// #332 重建行程

描述:给你一堆机票,请重建整个行程。如果有多种可能,选字典序最小的那个。

// Description: Reconstruct Itinerary | LeetCode OJ

解法1:拓扑排序。

// Solution 1: Topological sort.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#333 Largest BST Subtree

// #333 最大二叉搜索树子树

描述:给定二叉树,找出最大的二叉搜索树子树。

// Description: Largest BST Subtree | LeetCode OJ

解法1:跟判断BST一样。

// Solution 1: Same as validating a BST.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#334 Increasing Triplet Subsequence

// #334 递增三元组

描述:给定数组,问是否存在长度为3的递增子序列。

// Description: Increasing Triplet Subsequence | LeetCode OJ

解法1:看代码。

// Solution 1: Read the code.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#335 Self Crossing

// #335 自交叉

描述:给定一系列长度,从(0, 0)出发按照“上左下右...”顺序依长度逐个走下去。问走过的轨迹是否存在交叉?碰上就算。

// Description: Self Crossing | LeetCode OJ

解法1:谜之解法,很聪明。

// Solution 1: A clever solution, not mine.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#336 Palindrome Pairs

// #336 回文对

描述:给定一堆字符串,问哪两个连起来是回文串。求所有可能的回文对。

// Description: Palindrome Pairs | LeetCode OJ

解法1:字符串哈希,正向反向一起用。

// Solution 1: String hashing, both forward and reverse.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#337 House Robber III

// #337 小偷3

描述:这回房子构成一棵二叉树,依然不能偷相邻俩房子,求怎么偷最来钱。

// Description: House Robber III | LeetCode OJ

解法1:搜呗。

// Solution 1: Search it.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#338 Counting Bits

// #338 数位数

描述:给定一个非负整数num,求0~num每个数中二进制1的个数。

// Description: Counting Bits | LeetCode OJ

解法1:DP。

// Solution 1: DP.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#339 Nested List Weight Sum

// #339 嵌套列表加权和

描述:如题。

// Description: leetcode.com/problems/n

解法1:手动递归。

// Solution 1: Manual recursion.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#340 Longest Substring with At Most K Distinct Characters

// #340 包含至多K个不同字母的最长子串

描述:如题。

// Description: Longest Substring with At Most K Distinct Characters | LeetCode OJ

解法1:俩指针。

// Solution 1: Two pointers.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#341 Flatten Nested List Iterator

// #341 展开嵌套列表的迭代器

描述:像访问一个一维列表一样访问嵌套列表。

// Description: Flatten Nested List Iterator | LeetCode OJ

解法1:手动递归。

// Solution 1: Manual recursion.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#342 Power of Four

// #342 4的幂

描述:判断一个数是否为4的幂。

// Description: Power of Four | LeetCode OJ

解法1:循环。

// Solution 1: Loop.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110

解法2:对数。

// Solution 2: Logarithm.

代码2:github.com/zhuli1990110

// Code 2: github.com/zhuli1990110



#343 Integer Break

// #343 整数分解

描述:将一个正整数分解为至少两个正整数,使其乘积最大。

// Description: Integer Break | LeetCode OJ

解法1:DP。

// Solution 1: DP.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#344 Reverse String

// #344 反转字符串

描述:如题。

// Description: Reverse String | LeetCode OJ

解法1:转。

// Solution 1: Do it.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110

解法2:转。

// Solution 2: Do it.

代码2:github.com/zhuli1990110

// Code 2: github.com/zhuli1990110



#345 Reverse Vowels of a String

// #345 反转元音

描述:给定一个串,只反转元音。

// Description: Reverse Vowels of a String | LeetCode OJ

解法1:水题。

// Solution 1: Trivial.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#346 Moving Average from Data Stream

// #346 滑动窗口平均值

描述:如题。

// Description: leetcode.com/problems/m

解法1:滑呗。

// Solution 1: Slide it.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#347 Top K Frequent Elements

// #347 K个最常见元素

描述:给定数组,求其中出现频率最高的K个元素。

// Description: Top K Frequent Elements | LeetCode OJ

解法1:没意思。

// Solution 1: Dull.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#348 Design Tic-Tac-Toe

// #348 井字棋

描述:设计井字棋游戏。

// Description: Design Tic-Tac-Toe | LeetCode OJ

解法1:模拟题。

// Solution 1: Simulation problem.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#349 Intersection of Two Arrays

// #349 数组交集

描述:如题。

// Description: Intersection of Two Arrays | LeetCode OJ

解法1:水题。

// Solution 1: Easy.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#350 Intersection of Two Arrays II

// #350 数组交集2

描述:如题,不去重。

// Description: Intersection of Two Arrays II | LeetCode OJ

解法1:水题。

// Solution 1: Easy.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#351 Android Unlock Patterns

// #351 安卓解锁图案

描述:手机的解锁手势知道吧?找出经过格点数在m~n之间的所有解锁手势个数。手势中如果经过一个未访问的点,是不允许直接跳过的。

// Description: Android Unlock Patterns | LeetCode OJ

解法1:搜。

// Solution 1: DFS.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#352 Data Stream as Disjoint Intervals

// #352 数据流表示为离散区间

描述:设计一个数据结构,允许添加数据,允许统计元素的分布区间。

// Description: Data Stream as Disjoint Intervals | LeetCode OJ

解法1:哈希。

// Solution 1: Hash.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#353 Design Snake Game

// #353 贪食蛇

描述:设计贪食蛇游戏。

// Description: Design Snake Game | LeetCode OJ

解法1:很明显,用链表表示蛇比较合适,因为移动一格只需要改变头尾节点。

// Solution 1: Apparently, it's appropriate to represent the snake with a linked list, as moving one step requires only changing the head and the tail node.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#354 Russian Doll Envelopes

// #354 俄罗斯套娃

描述:给定一堆矩形,问最多能嵌套几层。

// Description: Russian Doll Envelopes | LeetCode OJ

解法1:O(N ^ 2) DP。

// Solution 1: O(N ^ 2) DP.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110

解法2:LIS。

// Solution 2: LIS.

代码2:github.com/zhuli1990110

// Code 2: github.com/zhuli1990110



#355 Design Twitter

// #355 设计推特

描述:太长不写。

// Description: Design Twitter | LeetCode OJ

解法1:麻烦的一塌糊涂,这叫算法题?这叫系统设计题还差不多。

// Solution 1: You call this algorithmic problem? I think system design suits better.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#356 Line Reflection

// #356 对称轴

描述:给定N个点,看是否存在一条竖直线,使得全图关于这条线对称。

// Description: leetcode.com/problems/l

解法1:挺无聊的一题。

// Solution 1: Relatively boring.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#357 Count Numbers with Unique Digits

// #357 数字不重复的数的个数

描述:给定整数N,求不超过N位的数字不重复的数的个数。

// Description: Count Numbers with Unique Digits | LeetCode OJ

解法1:这是个数学题。

// Solution 1: Math problem.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#358 Rearrange String k Distance Apart

// #358 重排字符串使相同字符至少相距k位

描述:如题。

// Description: Rearrange String k Distance Apart | LeetCode OJ

解法1:总是从剩余最多的字母开始考虑。

// Solution 1: Always start looking from the letter with the highest remaining count.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#359 Logger Rate Limiter

// #359 日志限速器

描述:设计一个数据结构,能打印日志。但如果相同的日志在过去10s内已经打印过了,就不打。

// Description: Logger Rate Limiter | LeetCode

解法1:模拟题。

// Solution 1: Simulation problem.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#360 Sort Transformed Array

// #360 排序变换后的数组

描述:给定一个数组,对每个元素执行f(x) = ax2 + bx + c的映射,求映射后结果,要求将结果排序,但不能使用排序算法。

// Description: leetcode.com/problems/s

解法1:这就叫没事找事,吃饱了撑的。

// Solution 1: Don't you have better things to do?

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#361 Bomb Enemy

// #361 轰炸敌人

描述:炸弹人玩过吧?假设炸弹只能放在空地,不能炸穿墙,可以贯穿多个敌人,求一个炸弹最多能炸死多少敌人。

// Description: leetcode.com/problems/b

解法1:也算是DP吧。

// Solution 1: I guess this is DP after all.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#362 Design Hit Counter

// #362 设计命中计数器

描述:设计一个计数器,可以在某个时间点命中,也可以统计以某个时间点截止的5分钟内的命中总次数。

// Description: leetcode.com/problems/d

解法1:用map。

// Solution 1: Use a map.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#363 Max Sum of Rectangle No Larger Than K

// #363 和不超过K的最大子矩阵

描述:给定一个矩阵,求和不超过K的最大子矩阵。

// Description: Max Sum of Rectangle No Larger Than K | LeetCode OJ

解法1:首先你要知道最大子矩阵和的求法,然后你要知道不超过K的最大子数组和的求法,然后就没有然后了。

// Solution 1: Know how to get maximal submatrix sum, know how to get maximal subarray sum no larger than K, know no more.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#364 Nested List Weight Sum II

// #364 嵌套列表加权和2

描述:和之前一样,不过这次权值反着来,越深的权值越小。

// Description: leetcode.com/problems/n

解法1:稍微变化一下。

// Solution 1: Minor change.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#365 Water and Jug Problem

// #365 水和罐子问题

描述:给定两个罐子和足够多的水。每次允许你倒水,但要求要么倒空,要么倒满,要么来回倒。给定俩罐子容积v1、v2,和一个体积v3,问能够得到v3体积的水。

// Description: Water and Jug Problem | LeetCode OJ

解法1:注意边界情况。

// Solution 1: Edge cases.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#366 Find Leaves of Binary Tree

// #366 捡树叶

描述:逐层移除二叉树的叶节点。

// Description: leetcode.com/problems/f

解法1:注意每个节点的高度,发现规律了吗?

// Solution 1: Note the height of each node, see?

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#367 Valid Perfect Square

// #367 验证完全平方数

描述:如题。

// Description: Valid Perfect Square | LeetCode OJ

解法1:匪开方,如之何?

// Solution 1: Any way around the square root?

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#368 Largest Divisible Subset

// #368 最大整除子集

描述:给定一个集合,找出最大的子集,使得子集中任意两数都有整除关系。

// Description: Largest Divisible Subset | LeetCode OJ

解法1:DP.

// Solution 1: DP.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#369 Plus One Linked List

// #369 链表加一

描述:给定一个链表表示高精度数,给加个1。

// Description: Plus One Linked List | LeetCode OJ

解法1:水题。

// Solution 1: Trivial.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#370 Range Addition

// #370 区间增加

描述:给定一个数组,开始全0.每次允许对一个区间统一加上某值。执行完一系列加法后,返回数组。

// Description: Range Addition | LeetCode OJ

解法1:树状数组的另一应用。

// Solution 1: Another application of BIT.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#371 Sum of Two Integers

// #371 整数加法

描述:不准用+-。

// Description: Sum of Two Integers | LeetCode OJ

解法1:想想加法器的原理。

// Solution 1: Think about how an adder works.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#372 Super Pow

// #372 超级幂

描述:底数小,指数非常大,结果膜。

// Description: Super Pow | LeetCode OJ

解法1:快速幂,不过这次是十进制的。

// Solution 1: Denary exponentiation, not binary.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#373 Find K Pairs with Smallest Sums

// #373 找出和最小的前K对

描述:给定两个有序数组,允许从俩数组各选一个数组成数对。求和最小的前K对。

// Description: Find K Pairs with Smallest Sums | LeetCode OJ

解法1:最小堆。

// Solution 1: Min heap.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#374 Guess Number Higher or Lower

// #374 高了低了

描述:猜吧。

// Description: Guess Number Higher or Lower | LeetCode OJ

解法1:二分。

// Solution 1: Binary search.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#375 Guess Number Higher or Lower II

// #375 高了低了

描述:还是猜数字,不过这次如果你猜x,而且猜错了,就要罚款x元。问至少要带多少钱才能保证赢?

// Description: Guess Number Higher or Lower II | LeetCode OJ

解法1:改个玩法,难度就完全不一样了。将[1, n]间猜数字作为总问题,则各种[i, j]可视为子问题,我们的目的是尽量少带钱,所以就要使罚款尽量少。由此,DP的根据就形成了。

// Solution 1: A small change in the rule create a whole new problem. If we view the guess among [1, n] as the whole problem, any [i, j] can be considered a subproblem. The goal is to bring as little money as possible, thus we need to minimize the cost of each subproblem. With these points clarified, the ground for DP is solid, now start coding.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#376 Wiggle Subsequence

// #376 摆动子序列

描述:按照“大小大小...”或者“小大小大...”的定义。找出数组中最长摆动序列的长度。

// Description: Wiggle Subsequence | LeetCode OJ

解法1:看代码。

// Solution 1: Read the code.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#377 Combination Sum IV

// #377 组合之和4

描述:给定集合,每个元素可使用任意多次。求加起来等于一个值target的所有组合种数,不同顺序也算数。

// Description: Combination Sum IV | LeetCode OJ

解法1:根本不用搜,DP就好。

// Solution 1: Don't resort to brute-force when there're more elegant ways.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#378 Kth Smallest Element in a Sorted Matrix

// #378 杨氏矩阵第K小元素

描述:如题。

// Description: Kth Smallest Element in a Sorted Matrix | LeetCode OJ

解法1:最小堆。

// Solution 1: Min heap.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#379 Design Phone Directory

// #379 设计手机路径

描述:设计一个电话簿,能够分配、释放号码,或检查号码是否存在。

// Description: leetcode.com/problems/d

解法1:模拟题,懒得多说。

// Solution 1: Simulation problem.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110

解法2:用哈希表代替位向量。

// Solution 2: Replace the bit vector with a hash table.

代码2:github.com/zhuli1990110

// Code 2: github.com/zhuli1990110



#380 Insert Delete GetRandom O(1)

// #380 插入、删除、随机读取O(1)

描述:设计一个数据结构,能够插入、删除数据,并能够以均等的机会随机读取一个元素。

// Description: Insert Delete GetRandom O(1) | LeetCode OJ

解法1:数组 + 哈希表。

// Solution 1: Array + hash table.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#381 Insert Delete GetRandom O(1) - Duplicates allowed

// #381 插入、删除、随机读取O(1)

描述:和之前一样,不过这次允许重复元素。

// Description: Insert Delete GetRandom O(1) - Duplicates allowed | LeetCode OJ

解法1:还是数组+哈希表,不过哈希表的内容稍加变化。

// Solution 1: Still array + hash table, just the value in the hash table needs a little change.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110

#382 Linked List Random Node

// #382 链表随机节点

描述:随机读取链表的一个节点。

// Description: Linked List Random Node | LeetCode OJ

解法1:水库采样。

// Solution 1: Reservoir Sampling.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#383 Ransom Note

// #383 赎金纸条

描述:判断一个字符串的字母是否是另一个字符串的子集。

// Description: Ransom Note | LeetCode OJ

解法1:水题。

// Solution 1: Trivial.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#384 Shuffle an Array

// #384 洗牌

描述:如题。

// Description: Shuffle an Array | LeetCode OJ

解法1:O(N)时间搞定。

// Solution 1: O(N) time.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#385 Mini Parser

// #385 迷你解析器

描述:给定一个嵌套字符串,将其解析成嵌套列表。

// Description: Mini Parser | LeetCode OJ

解法1:解呗。

// Solution 1: Solve it.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#386 Lexicographical Numbers

// #386 字典序数

描述:给定整数n,将1~n按字典序排序。

// Description: Lexicographical Numbers | LeetCode OJ

解法1:想想相邻俩数之间有什么规律?

// Solution 1: What regularities do lexicographically adjacent numbers hold?

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#387 First Unique Character in a String

// #387 第一个不重复字母

描述:如题。

// Description: First Unique Character in a String | LeetCode OJ

解法1:水题。

// Solution 1: Trivial.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#388 Longest Absolute File Path

// #388 最长绝对路径

描述:给定文件树,求最长绝对文件路径。

// Description: Longest Absolute File Path | LeetCode OJ

解法1:这题测试数据有问题。

// Solution 1: The test cases of this problem are bugged.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#389 Find the Difference

// #389 找不同

描述:给定两个字符串,其中一个多了个字母,找出该字母。

// Description: Find the Difference | LeetCode OJ

解法1:数数。

// Solution 1: Count them.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110

解法2:排序。

// Solution 2: Sort them.

代码2:github.com/zhuli1990110

// Code 2: github.com/zhuli1990110



#390 Elimination Game

// #390 消除游戏

描述:从左到右1~n共n个数字,轮流按照“所有奇位置”“所有偶位置”的规则,去掉当前序列中对应的数,直到只剩一个数为止。问这个数是几?

// Description: Elimination Game | LeetCode OJ

解法1:不管进行几轮,剩下的数列始终是个等差数列。算好首项和公差,一切就真相大白了。

// Solution 1: No matter how the elimination is done, the left sequence is always arithmetic. Thus we calculate the initial term and the common difference, everything else is brought to light.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#391 Perfect Rectangle

// #391 完美矩形

描述:给定一堆矩形,问能不能恰好覆盖成一个矩形,要求严丝合缝、不多不少。

// Description: Perfect Rectangle | LeetCode OJ

解法1:如果恰好能覆盖成完整矩形,那么面积、顶点会不会有什么规律呢?

// Solution 1: If there happens to be an exact cover, would anything special be in the vertices and areas?

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#392 Is Subsequence

// #392 是否为子序列

描述:给定一长一短俩串儿,判断短的是不是长的的子序列。

// Description: Is Subsequence | LeetCode OJ

解法1:扫一遍就行了。

// Solution 1: Scan it.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#393 UTF-8 Validation

// #393 UTF-8验证

描述:告诉你UTF-8的编码规则,请验证一段数据的合法性。

// Description: UTF-8 Validation | LeetCode OJ

解法1:按规矩来。

// Solution 1: By the book.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#394 Decode String

// #394 字符串解码

描述:给定游程码字符串,进行解码。

// Description: Decode String | LeetCode OJ

解法1:递归解码。

// Solution 1: Decode recursively.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#395 Longest Substring with At Least K Repeating Characters

// #395 字母至少重复K次的最长子串

描述:如题,子串中的每个字母都要有至少K个,求最长子串。

// Description: Longest Substring with At Least K Repeating Characters | LeetCode OJ

解法1:还是俩指针,不过代码稍微复杂些。

// Solution 1: Still needs two pointers. The code looks more complicated, though.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#396 Rotate Function

// #396 旋转函数

描述:懒得说。

// Description: Rotate Function | LeetCode OJ

解法1:小把戏。

// Solution 1: Small trick.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#397 Integer Replacement

// #397 整数替换

描述:如果n是偶数,则变成n / 2;否则,变成n - 1或者n + 1。问至少多少次操作,能把n变成1。

// Description: Integer Replacement | LeetCode OJ

解法1:DP。

// Solution 1: DP.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#398 Random Pick Index

// #398 随机选下标

描述:给定一个可能有重复的数组,给定一个值,随机输出一个该值的下标。

// Description: leetcode.com/problems/r

解法1:水库采样,时间换空间。

// Solution 1: Reservoir Sampling, trading time for space.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#399 Evaluate Division

// #399 变量相除

描述:给你一些变量相除的结果,要你求出另一些变量相除的结果。

// Description: Evaluate Division | LeetCode OJ

解法1:带权并查集?

// Solution 1: Weighted union-find set?

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110



#400 Nth Digit

// #400 第N位数

描述:把1、2、3、...写成一串。求第N位数是什么?

// Description: Nth Digit | LeetCode OJ

解法1:我讨厌数数。

// Solution 1: I hate counting.

代码1:github.com/zhuli1990110

// Code 1: github.com/zhuli1990110

编辑于 2017-03-20