查看: 1511| 回复: 8
收起左侧

[高频题] 一道经典题

RockyLiBOFL | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   105
87%
13%
16

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
给一个int数组,一个数K,K代表数组里相邻的K个数字

以K个数为单位遍历这个数组,每个单位里最小值为  minI,

求{min0, min1, min2......minN}里面的最大值

public int get(int[ ] arr, int k) {

}

例子:
input:    arr = {4,3,5,1}     k = 2
output:    3

分析:
分组: {4, 3}   {3, 5}   {5, 1}
min:         3       3         1

上一篇:一个不错的刷题准备视频。重新post一下。来自BasketWang
下一篇:The art of Computer Programming 值得仔细读吗
dengzx77 2020-3-15 00:01:23 来自APP | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   29
94%
6%
2
滑动窗口吗
回复

使用道具 举报

chenmaosheng 2020-3-15 00:25:09 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   48
87%
13%
7
Sliding windows
回复

使用道具 举报

GCY_89757 2020-3-15 08:04:19 来自APP | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   18
100%
0%
0
如果是用sliding window的话,是每次维护一个长度为k的子数组吗,这样在窗口移动的时候,如何更新子数组的最小值呢,比如[1,4,2,5,3],k=4。第一个长度为4的子数组最小值为1,第二个长度为4的子数组最小值2怎么提取出来呢,每次都用min函数或者小根堆来提取嘛?如果是这样感觉跟遍历没什么区别。还是有其他更好的方法?打扰了~
回复

使用道具 举报

dengzx77 2020-3-15 09:33:19 来自APP | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   29
94%
6%
2
GCY_89757 发表于 2020/03/15 08:04:19
如果是用sliding window的话,是每次维护一个长度为k的子数组吗,这样在窗口移动的时候,如何更新子数组的最小值...
用两个指针L和R表示窗口的左端和右端,就不用一直维护一个额外的子数组了。在窗口移动的过程中,记录窗口内元素的最小值min。当R右移时,比较新元素和min的大小。当L右移时,如果原min移出,重新计算窗口的新min。这样应该会比遍历的O(nk)快些。
回复

使用道具 举报

AbelEinzbern 2020-3-15 09:36:21 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   39
100%
0%
0
这个题可以看刷题网239, 最优解得用monotonic queue, sliding minimum 弄一个increasing的deque每次取head.

评分

参与人数 1大米 +2 收起 理由
dennyzhang007 + 2 给你点个赞!

查看全部评分

回复

使用道具 举报

GCY_89757 2020-3-15 10:19:52 来自APP | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   18
100%
0%
0
dengzx77 发表于 2020/03/15 09:33:19
用两个指针L和R表示窗口的左端和右端,就不用一直维护一个额外的子数组了。在窗口移动的过程中,记录窗口内元素的最小值min...
嗯嗯 对的!谢谢
回复

使用道具 举报

chgwang 2020-3-15 10:33:43 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   81
98%
2%
2
https://www.geeksforgeeks.org/sl ... ubarrays-of-size-k/

看链接里的O(n),是找出所有的k subarray max,跟你的题其实就一回事,max再去min就好了或者,每次取deque head的时候比较一下,就是max min了 (我觉得楼上说的就是这个)

(希望能有奖励)

评分

参与人数 1大米 +2 收起 理由
dennyzhang007 + 2 很有用的信息!

查看全部评分

回复

使用道具 举报

GCY_89757 2020-3-15 10:36:22 来自APP | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   18
100%
0%
0
dengzx77 发表于 2020/03/15 09:33:19
用两个指针L和R表示窗口的左端和右端,就不用一直维护一个额外的子数组了。在窗口移动的过程中,记录窗口内元素的最小值min...
可以用双端队列来做,这样就不用重新计算min了,跟利口二三就很像,你可以看一下~
回复

使用道具 举报

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

本版积分规则

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