LeetCode 56. Merge Intervals
input:
list of intervalsoutput:
list of intervals after merging all overlapping intervals including equals.
时间复杂度 O(nlogn), 空间 O(1).
- 按 start 大小排序 O(nlogn)
- 排序之后 2 种情况需要 merge,
- 后面元素的 start 小于或等于前面元素的 end.
- 所以需要一个 prev 记录一下前一个元素的 end 是什么(包括已经 merge 了的元素).
- 后面元素的 start 要大于前一个元素的 end.
- 更新 prev, 存入这个 candidate, 继续 merge.
- 后面元素的 start 小于或等于前面元素的 end.
1 | public class MergeIntervals { |
LeetCode 643 Maximum Average Subarray I
input:
int array and window size k.ouput:
return the maximum average sum of subarray of size k.
时间复杂度 O(n), 空间复杂度 O(1).
固定窗口问题, 取窗口和的最大值, 然后返回平均值.
1 | public class MaximumAverageSubarrayI { |
LeetCode 293 FlipGameI
input:
a string with “+” or “-“.output:
return list of string with all possible moves.
时间复杂度 O(n), 空间复杂度 O(1).
只有相邻的两个元素才可以翻转, 找出所有可能的路径, 从头开始翻转, 翻转之后存到结果里面, 然后再翻转回来.
1 | public class FlipGameI { |
LeetCode 415 Add Strings
input:
two strings with digits numbers only.output:
return a string of the sum of input strings.
时间复杂度 O(n), 空间复杂度 O(n^2).
使用 String concatenation, 避免了翻转 String, 但是增加了空间复杂度. 因为每一次都生成了一个新的 string.
1 | public class AddStrings { |
LeetCode 346 Moving Average from Data Stream
Implement a method that calculates avarage certain numbers from a data stream.
使用一个 queue 来存放需要计算的元素, 因为 queue 的容量是固定的, 如果超出规定数量, 则先进来的元素要被删除.
1 | public class MovingAverageFromDataStream { |
LeetCode 66 Plus One
input:
int array represents one negative integer.output:
plus one to the integer.
时间复杂度 O(n), 空间复杂度 O(1).
从后往前加, 如果最后需要进位, 则新建一个长度加 1 的 array. 和 Add Strings 几乎一样.
1 | public class PlusOne { |
LeetCode 356 Line Reflection
input:
2D array represents points on a coordinate plane.output:
Whether the points has a reflectional line that parallel to y-axis.
所有的点都存在一条与 y 轴平行的线, 那么只需要考虑 x 轴上面的值就可以了, 直观想到就是先用 HashMap<y 值, Set<x 值>> 这样一个数据结构把每一组 x 存起来. 因为所有元素都与这一条 y 轴平行, 那么只需要确定 x 轴上面的左右边界, 然后遍历 x 上面的点, 看是否存在其对称轴的值.
时间复杂度 O(n). 第一次遍历, 存 map, 第二次遍历, 看 x 值, 总的时间复杂度应该是所有元素的 2 倍, 也就是 2 _ 2 _ n, 所以是 O(n). 空间复杂度也是 O(n), n 是 array 里面所含元素的数量.
1 | public class LineReflection { |
LeetCode 270 Closest Binary Search Tree Value
input:
A root node of a binary search tree, and a target number which is type of double.output:
return the closest value of the tree to the target.
既然是 binary search tree 还是可以用二分的思想, 如果 root 的值小于 target, 那么就往右看, 否则往左看. 可以使用 2 种方法, binary search 和 inorder traverse. Inorder traverse 的方法时间复杂度是 O(n)的, 空间是 O(h) 的. 所以 binary search 要好一些.
- Iteration. 时间复杂度 O(h), 空间 O(1). 遍历过程中如果有需要, update 结果.
1 | public class ClosestBSTValue { |
- Recursion. 找到左子树的左右节点, 以及右子树的最左节点. 也就是找到比 target 小的最大值, 以及比 target 大的最小值. 然后比较哪一个更接近.
binary search 时间复杂度 O(h), 空间复杂度 O(h), 递归调用 call stack.
1 | public class ClosestBSTValue { |
LeetCode 293 Flip GameI
input:
a string consist of ‘+’ and ‘-‘.output:
return all valid states after one valid move.
只有 “++” 才可以被翻转为 “–”, 那么只需要考虑 “++” 的状态就好了. 从做到有扫一遍, 每次只做一次翻转, 把 state 存起来, 然后恢复之前的状态, 继续右移指针, 知道 string 结尾.
时间复杂度 O(n), 空间 O(n). 对于 java 来说需要把 string 转换成 char[], 否则无法进行 inplace 的更改操作, 所以需要使用额外的数据结构以及空间来存放 input.
1 | public class FlipGameI { |
—
- 1.图片引用自网络,如有侵权请联系删除. ↩