边工作边刷题:70天一遍leetcode: day 1
(今日完成: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机器上得到一个数量值,然后轮数。
- 基本framework: 两个元素:单机上的量(O(n/s)),多少轮(O(log(n/s)):因为单机每次减半,那么这么多轮后就空了)。
边工作边刷题:70天一遍leetcode: day 1的更多相关文章
- 边工作边刷题:70天一遍leetcode: day 89
Word Break I/II 现在看都是小case题了,一遍过了.注意这题不是np complete,dp解的time complexity可以是O(n^2) or O(nm) (取决于inner ...
- 边工作边刷题:70天一遍leetcode: day 77
Paint House I/II 要点:这题要区分房子编号i和颜色编号k:目标是某个颜色,所以min的list是上一个房子编号中所有其他颜色+当前颜色的cost https://repl.it/Chw ...
- 边工作边刷题:70天一遍leetcode: day 78
Graph Valid Tree 要点:本身题不难,关键是这题涉及几道关联题目,要清楚之间的差别和关联才能解类似题:isTree就比isCycle多了检查连通性,所以这一系列题从结构上分以下三部分 g ...
- 边工作边刷题:70天一遍leetcode: day 85-3
Zigzag Iterator 要点: 实际不是zigzag而是纵向访问 这题可以扩展到k个list,也可以扩展到只给iterator而不给list.结构上没什么区别,iterator的hasNext ...
- 边工作边刷题:70天一遍leetcode: day 101
dp/recursion的方式和是不是game无关,和game本身的规则有关:flip game不累加值,只需要一个boolean就可以.coin in a line II是从一个方向上选取,所以1d ...
- 边工作边刷题:70天一遍leetcode: day 70
Design Phone Directory 要点:坑爹的一题,扩展的话类似LRU,但是本题的accept解直接一个set搞定 https://repl.it/Cu0j # Design a Phon ...
- 边工作边刷题:70天一遍leetcode: day 71-3
Two Sum I/II/III 要点:都是简单题,III就要注意如果value-num==num的情况,所以要count,并且count>1 https://repl.it/CrZG 错误点: ...
- 边工作边刷题:70天一遍leetcode: day 71-2
One Edit Distance 要点:有两种解法要考虑:已知长度和未知长度(比如只给个iterator) 已知长度:最好不要用if/else在最外面分情况,而是loop在外,用err记录misma ...
- 边工作边刷题:70天一遍leetcode: day 71-1
Longest Substring with At Most K Distinct Characters 要点:要搞清楚At Most Two Distinct和Longest Substring W ...
随机推荐
- 给SHP文件定义投影
#!/usr/bin/env python # -*- coding: utf-8 -*- import urllib.request import os def get_epsg_code(epsg ...
- 客户端调用服务端webservice的端口问题
今天有一个同事过来问:他有一个程序在A服务器上调第三方B服务器短信发送服务接口(webservice),无论是否发送成功,服务接口都会返回状态.现在客户要做每一个服务器 做入站端口管控,一切不必要的端 ...
- assign、retain、copy使用异同
1 三者的区别 首先,引用计数的概念:表示对象被引用的次数.当引用计数为 0 的时候,系统就会发送dealloc消息来释放内存. assign:用于基本数据类型,没有引用计数,因此不存在增加或减少引用 ...
- 自定义Cell的方法
Cell属于UITableView中的组件,有多种定义方式,有系统自带的方法,有自定义的方法. 可以使用系统的方法setSeparatorColor(设置分割线颜色) 设置setSeparatorSt ...
- iOS之 HTTP、Socket、TCP的区别(易混
一.HTTP 是一种超文本传输协议,全名hypertext transfer protocol,从字面意思上可以看出该协议用于规定客户端与服务端之间的传输规则, 传输的内容不限于文本(任意类型的数据) ...
- 表单form的enctype="multipart/form-data"使用疑惑
在使用表单传送数据的时候,如果form 加了enctype="multipart/form-data" 这个属性,那么表单请求传到另一个jsp或servlet 里时是不能用requ ...
- 学习 zookeeper
1.zookeeper是什么 zookeeper是hadoop的分布式协调服务.主要作用是对hadoop的集群节点进行监控.但是由于其功能的单一而去不依赖hadoop其他框架,所以不局限在hadoop ...
- 15、安全工程师要阅读的书籍 - IT软件人员书籍系列文章
信息安全工程师是一个比较新兴的角色.在2016年今年的下半年软考就将安全工程师纳入了考试科目,说明国家对安全工程师的需求还是不错的.安全工程师包括硬件和软件两块内容吧.这里描述的安全工程师主要是针对软 ...
- Ajax最详细的参数解析和场景应用
4.1.定义和用法 AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJAX = 异步 J ...
- Java Gradle入门指南之内建与定制任务类(buildSrc、Groovy等)
上一篇随笔介绍了Gradle的安装与任务管理,这篇着重介绍Gradle的内建任务(in-built tasks)与自定义任务(custom tasks),借助Gradle提供的众多内建任务类型 ...