📣 Back to School开学季 - VIP通行证5折优惠!蓝莓、Offer多多同步优惠
楼主: sweetsinpackets
跳转到指定楼层
上一主题 下一主题
收起左侧

脸家面经

 
全局:
第一题是二分长度+两个单调队列找min和max吧。从头到尾O(n)校验,当窗口大小为mid且max-min=mid-1就找到了。然后继续二分长度,直到退出。

补充内容 (2021-09-24 08:35 +08:00):
所以是O(nlogn)
回复

使用道具 举报

地里匿名用户
🔗
匿名用户-TZH8S  2021-9-24 08:51:02
xqfq 发表于 2021-9-23 20:32
在你楼下,谢谢你的o(n^2)滑动窗口解法,我看看

谢谢分享哈。
比如[2,1,3,4,0,1,2,9],第一次mid对应是4然后第一个窗口找到了是[2,1,3,4],请问你下一步怎么二分能保证最后找到的最长的是[3,4,0,1,2]呢
回复

使用道具 举报

地里匿名用户
🔗
匿名用户-MPS3K  2021-9-24 22:05:02
写了个nlogn 的代码。
  1. def findMaxSubarray(nums):
  2.    
  3.     def slidingMin (k):
  4.         dq = deque([])
  5.         res = []
  6.         for i, num in enumerate(nums):
  7.             while dq and nums[dq[-1]] >= num:
  8.                 dq.pop()
  9.             dq.append (i)
  10.             while dq and dq[0] <= i - k:
  11.                 dq.popleft()
  12.             if i >= k - 1:
  13.                 res.append (nums[dq[0]])
  14.         return res
  15.    
  16.     def slidingMax (k):
  17.         dq = deque([])
  18.         res = []
  19.         for i, num in enumerate(nums):
  20.             while dq and nums[dq[-1]] <= num:
  21.                 dq.pop()
  22.             dq.append(i)
  23.             while dq and dq[0] <= i - k:
  24.                 dq.popleft()
  25.             if i >= k - 1:
  26.                 res.append(nums[dq[0]])
  27.         return res
  28.    
  29.     def is_valid (k):
  30.         k_window_min = slidingMin (k)
  31.         k_window_max = slidingMax (k)
  32.         for k_min, k_max in zip(k_window_min, k_window_max):
  33.             if k_max - k_min + 1 == k:
  34.                 return True
  35.         return False
  36.    
  37.      # binary search over the size of subarray
  38.     lo, hi = 1, len(nums)
  39.     while lo < hi:
  40.         # since we are moving [lo] pointer, take [mid] to be (hi + lo + 1) // 2 to avoid infinite loop
  41.         mid = lo + (hi - lo + 1) // 2
  42.         if is_valid(mid):
  43.             lo = mid
  44.         else:
  45.             hi = mid - 1
  46.     return lo
  47.             

  48. print(findMaxSubarray([2,11,3,4,0,1,2,9])) #5
  49. print(findMaxSubarray([2,8,1,2,3,9,4])) #3
  50. print(findMaxSubarray([1,3,2,5,4,6,7,8,9])) #9
  51. print(findMaxSubarray([2,1,1,2,3])) #3
  52. print(findMaxSubarray([1,2,1,4])) #2
  53. print(findMaxSubarray([1,2,3,4])) #4
  54. print(findMaxSubarray([1,1,1,1])) #1
复制代码
回复

使用道具 举报

地里匿名用户
🔗
匿名用户-9WDL1  2021-9-25 04:28:32
谢谢楼主分享
回复

使用道具 举报

🔗
Znedison 2021-9-25 08:43:57 | 只看该作者
全局:
匿名者 发表于 2021-9-24 08:05
写了个nlogn 的代码。

是不对的,好像不能够二分。
试试这个例子 print(findMaxSubarray([11,2,3,4,0,5,1,9])) 你的program 会print 3, 但是答案是6
回复

使用道具 举报

🔗
Znedison 2021-9-25 08:45:35 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies

评分

参与人数 2大米 +2 收起 理由
xqfq + 1 好tricky,要是面试就挂了TVT
我已全仓 + 1 有道理 没考虑到..

查看全部评分

回复

使用道具 举报

全局:
Znedison 发表于 2021-09-24 17:45:35
好像是不对的,如果数组中存在一个长度为6的subarray,但是不能保证长度为4的subarray一定存在,这时候二分的upper bound会回收到4 永远到不了5
有道理 没考虑到..
回复

使用道具 举报

地里匿名用户
🔗
匿名用户-MPS3K  2021-9-25 09:30:47
匿名者 发表于 2021-9-24 07:05
写了个nlogn 的代码。

多谢大家指正。二分法是不行的。因为我们并不能保证 如果长度m不存在,那么n >= m也不存在。比如这个例子[11,2,3,4,0,5,1,9],长度4不行,但是6可以。二分的话,会输出错误结果。
回复

使用道具 举报

🔗
xinwangcas 2021-9-25 10:58:52 | 只看该作者
全局:
谢谢分享!
回复

使用道具 举报

🔗
xqfq 2021-9-25 13:34:18 | 只看该作者
全局:
Znedison 发表于 2021-9-24 17:45
好像是不对的,如果数组中存在一个长度为6的subarray,但是不能保证长度为4的subarr ...
好tricky,要是面试就挂了TVT
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表