array

先从数组系类开始吧(1-20)
1.two sum 2017.9.20-2017.9.21

array_第1张图片
two sum

思索:第一想法就是用排序,二分或者set来做,复杂度O(nlgn).但后来发现题目中没有说数组中没有存在重复数字,target也可以用两个相同的数组成,由于本题需要统计原来数组下标,所以用multimap来写。
类似multiset/set,map/multimap之类的容器还是比手写的排序快一点的,虽然可能没有手写的其他数据结构快,但也够用。
常见用法: http://blog.csdn.net/cws1214/article/details/8211881
代码: https://pastebin.com/m6HceqCS
第二种想法:可以使用双指针的方法,为了记录下标和方便排序,可以使用stl中的pair来存储(pair排序先按first排,相同再按second排),排序后,使用双指针的算法,从两边向中间靠。复杂度O(n).
代码: https://pastebin.com/kHugDChb

2.Median of Two Sorted Arrays 2017.9.21-


array_第2张图片
Median of Two Sorted Arrays

两个排好序的数组找中位数,复杂度要求O(lg(m+n))

3.Container With Most Water 2017.9.21-9.21

Container With Most Water

面积取决于两块板之间的长度和两块板中的小的那一块,现在板子的位置固定了,暴力的做法,O(n^2),但也存在更快的O(n)的做法。
array_第3张图片
示例

脑补一下,1和5的边作比较,5比1小,那么可以直接放弃5边与其他边的组合,无论怎么组,都不可能大于1和5的组合,同理,当1和4比较的时候,放弃1边继续比较,因为长度始终在减小,这个剪枝是合理存在的。我们可以在O(n)的复杂度下,计算出最大面积。可以用双指针的方法。
那么如果两个边相等呢?该怎么办?
答案当然是都放弃了。。。
代码: https://pastebin.com/pEtKuZsN

你可能感兴趣的:(array)