(今日完成:Two Sum, Add Two Numbers, Longest Substring Without Repeating Characters, Median of Two Sorted Arrays, Longest Palindromic Substring)

恼人的median of two sorted arrays

前几年google的必考题,现在考的比较少了,思路就是binary search,具体来说,

  • 如果是一个array,因为是sorted,找到第k个元素是trivial。如果2个array,可以把一个array B作为pivot而搜索另一个array A是否有第k个。因为已知array A中第ith,找array B中(k-i)th也是trivial的。
  • 如果在array A中没找到,再交换两个array重新搜索。
  • 这题恶心在corner case。找到的条件是A的第ith在B中k-1-i-1和k-1-i之间。另外两种情况是<B[k-1-i-1]和>B[k-1-i]。具体见code,建议大致明白三种情况后死记binary search的条件,反正过不久就忘了,呵呵。

google曾经的面试题是这个的简单扩展:如果给定两个数组中的某一个数,找到离这个数第k近的数。直接用binary search找到这个数后确定次序k’,然后用上面的方法找到第(k+k’)th

class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
def median(nums1, nums2, low, high, k):
if low>high:
return median(nums2, nums1, 0, len(nums2)-1, k) i = low+(high-low)/2
j = k-i-1-1
n = len(nums2) if (j<0 or (j<n and nums1[i]>=nums2[j])) and (j>=n-1 or (j+1>=0 and nums1[i]<=nums2[j+1])):
return nums1[i]
elif j<0 or (j+1<n and nums1[i]>nums2[j+1]):
return median(nums1, nums2, low, i-1, k)
else:
return median(nums1, nums2, i+1, high, k) n1,n2 = len(nums1),len(nums2)
if (n1+n2) & 1 == 1:
return median(nums1, nums2, 0, n1-1, (n1+n2)/2+1)/1.0
else:
return (median(nums1, nums2, 0, n1-1, (n1+n2)/2)+median(nums1, nums2, 0, n1-1, (n1+n2)/2+1))/2.0

这题还有个分布式的版本: n个data分布到s台机器上去做

https://www.quora.com/Distributed-Algorithms/What-is-the-distributed-algorithm-to-determine-the-median-of-arrays-of-integers-located-on-different-computers

  • 就是master/slave的结构。
  • analysis:
    • 基本framework: 两个元素:单机上的量(O(n/s)),多少轮(O(log(n/s)):因为单机每次减半,那么这么多轮后就空了)。

      • 多少台机器不是考虑因素:如果s台机器并行,假设同时进行,这样和一台的时间相同。
      • 注意每台机器上可以先排序,也可以不排。不排就是O(n/s)
    • 结果:O(n/s)+O(slog(n/s))
      • O(n/s):单机slave的总运算,superisingly,竟然和第一轮是同一量级的。主要利用1/(20)+1/(21)+...+1/(2^log(n/s))≈1。
      • O(slog(n/s)):master的总运算量:每次都是从s机器上得到一个数量值,然后轮数。

边工作边刷题:70天一遍leetcode: day 1的更多相关文章

  1. 边工作边刷题:70天一遍leetcode: day 89

    Word Break I/II 现在看都是小case题了,一遍过了.注意这题不是np complete,dp解的time complexity可以是O(n^2) or O(nm) (取决于inner ...

  2. 边工作边刷题:70天一遍leetcode: day 77

    Paint House I/II 要点:这题要区分房子编号i和颜色编号k:目标是某个颜色,所以min的list是上一个房子编号中所有其他颜色+当前颜色的cost https://repl.it/Chw ...

  3. 边工作边刷题:70天一遍leetcode: day 78

    Graph Valid Tree 要点:本身题不难,关键是这题涉及几道关联题目,要清楚之间的差别和关联才能解类似题:isTree就比isCycle多了检查连通性,所以这一系列题从结构上分以下三部分 g ...

  4. 边工作边刷题:70天一遍leetcode: day 85-3

    Zigzag Iterator 要点: 实际不是zigzag而是纵向访问 这题可以扩展到k个list,也可以扩展到只给iterator而不给list.结构上没什么区别,iterator的hasNext ...

  5. 边工作边刷题:70天一遍leetcode: day 101

    dp/recursion的方式和是不是game无关,和game本身的规则有关:flip game不累加值,只需要一个boolean就可以.coin in a line II是从一个方向上选取,所以1d ...

  6. 边工作边刷题:70天一遍leetcode: day 70

    Design Phone Directory 要点:坑爹的一题,扩展的话类似LRU,但是本题的accept解直接一个set搞定 https://repl.it/Cu0j # Design a Phon ...

  7. 边工作边刷题:70天一遍leetcode: day 71-3

    Two Sum I/II/III 要点:都是简单题,III就要注意如果value-num==num的情况,所以要count,并且count>1 https://repl.it/CrZG 错误点: ...

  8. 边工作边刷题:70天一遍leetcode: day 71-2

    One Edit Distance 要点:有两种解法要考虑:已知长度和未知长度(比如只给个iterator) 已知长度:最好不要用if/else在最外面分情况,而是loop在外,用err记录misma ...

  9. 边工作边刷题:70天一遍leetcode: day 71-1

    Longest Substring with At Most K Distinct Characters 要点:要搞清楚At Most Two Distinct和Longest Substring W ...

随机推荐

  1. 原生JS实现轮播+学前端的感受(防止走火入魔)

    插件!插件!天天听到有人求这个插件,那个插件的,当然,用第三方插件可以大幅提高开发效率,但作为新手,我还是喜欢自己来实现,主要是我有时间! 今天我来给大家分享下用原生JS实现图片轮播的写法 前辈们可以 ...

  2. 渗透测试常规思路分析-FREEBUF

    最基础但练得好最后也非常厉害 1.  主要由于服务器配置等原因造成的信息泄露 常用google ,bing等搜索工具,轻量级的搜索出一些遗留后门,不想被发现的后台入口,中量级的搜索出一些用户信息泄露, ...

  3. iOS自动化编译

    最近研究了一下iOS的自动化编译,目的是为了简化测试和开发的同学沟通协调的次数,实现测试同学可以随时从网页操作编译SVN最新源码并打包ipa进行测试. 具体思路是通过从配置文件读取需要编译的项目配置列 ...

  4. iOS 三方库fmdb 的使用

    使用fmdb 做本地数据的存储非常方便, 1. github 上搜索fmdb 下载压缩包 导入到工程中 (如果你的mac 有cocoapod 也可以直接通过cocoapod 添加) 2. 以下代码是通 ...

  5. 对抽屉效果几大github第三方库的调研

    在公司项目新版本方案选择中,对主导航中要使用的抽屉效果进行了调研.主要原因是旧的项目中所用的库ECS评价不是很好.现对当下比较火的几大热门抽屉效果的第三方库进行了调研.代码全部选自github 如果你 ...

  6. Android 短视频拍摄、拍照滤镜 第三方库SDK

    视频 1.趣拍云服务 http://vcs.qupai.me/ 拍照 1.camera360 SDk 拍照滤镜 http://www.camera360.com/ 2 .凃图 http://tusdk ...

  7. Swift-Switch穿透

    switch vegetable {        case "celery":            print("Add some raisins and make ...

  8. 如何为Swift进行宏定义

    这阵子一直在自学Swift, 因为之前iOS的开发一直用Objective-C, 所以习惯了C语言那种宏定义方式, Swift作为一款更加安全的语言, 放弃了C语言中的宏定义, 有效的防止预编译时代码 ...

  9. ASP.NET处理301重定向方法 带示例 (demo)

    System.Web.HttpContext.Current.Response.Status = "301 Moved Permanently"; System.Web.HttpC ...

  10. ArrayList vs LinkedList vs Vector

    List概览 List,正如它的名字,表明其是有顺序的.当讨论List的时候,最好拿它跟Set作比较,Set中的元素是无序且唯一:下面是一张类层次结构图,从这张图中,我们可以大致了解java集合类的整 ...