Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >keep move!滑动窗口中位数与滑动魔方

keep move!滑动窗口中位数与滑动魔方

作者头像
掘金安东尼
发布于 2022-09-19 03:04:55
发布于 2022-09-19 03:04:55
25900
代码可运行
举报
文章被收录于专栏:掘金安东尼掘金安东尼
运行总次数:0
代码可运行

这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

前面已经带来 2 篇关于滑动窗口的掘文,传送门:

前文说到,即使都是窗口滑动,但“怎么滑”,滑动后“怎么做”,里面就存在很大的解题思路的差异!

本篇继续来探索、发现、记录这个差异~ 当然也不能忘了解题中的感受分享~

滑动窗口中位数

题目:给你一个数组 nums,有一个长度为 k 的窗口从最左端滑动到最右端。窗口中有 k 个数,每次窗口向右移动 1 位。你的任务是找出每次窗口移动后得到的新窗口中元素的中位数,并输出由它们组成的数组。

中位数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
中位数是有序序列最中间的那个数。如果序列的长度是偶数,则没有最中间的数;此时中位数是最中间的两个数的平均数,例如:

[2,3,4],中位数是 3
[2,3],中位数是 (2 + 3) / 2 = 2.5

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
给出 nums = [1,3,-1,-3,5,3,6,7],以及 k = 3。

窗口位置                      中位数
---------------               -----
[1  3  -1] -3  5  3  6  7       1
 1 [3  -1  -3] 5  3  6  7      -1
 1  3 [-1  -3  5] 3  6  7      -1
 1  3  -1 [-3  5  3] 6  7       3
 1  3  -1  -3 [5  3  6] 7       5
 1  3  -1  -3  5 [3  6  7]      6

因此,返回该滑动窗口的中位数数组 [1,-1,-1,3,5,6]

有了前面两篇文章的基础,老观众肯定知道:此题解题的关键肯定不在于窗口滑动,而在于“滑动的过程中怎么去求这个中位数?”

暴力求解:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 计算中位数---奇数情况
function calMedianOdd(sortedWindow) {
    const len = sortedWindow.length;
    return sortedWindow[Math.floor(len / 2)];
}
// 计算中位数---偶数情况
function calMedianEven(sortedWindow) {
    const len = sortedWindow.length;
    return (sortedWindow[Math.floor(len / 2)] +
        sortedWindow[Math.floor(len / 2) - 1]) / 2;
}

不出意外,会报错:超出时间限制,因为每次发生窗口滑动了,还要进行排序,时间复杂度大于 O(n * k),还取决于排序算法;

那有没有什么办法在滑动窗口的时候能利用上一个滑窗的状态?

答案肯定是“有的”,不然到这就剧终了~

有一个很重要的条件不能忽略:每次移动时,在删除左边界元素与加入右边界元素之前,窗口内的内容必然有序;

所以,在我们初始化排完顺序之后,发生第一次窗口的滑动时,希望找到右边界元素插入的正确位置(splice),以保障插入后直接就是有序的了,不用再排序了;

于是乎:问题变成了 —— 在有序数列中找到一个位置,于是乎,【二分法】登场!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 二分搜索
function binarySearch(sortedArr, target) {
    // 这里的搜索区间是左闭右开
    let left = 0;
    let right = sortedArr.length;
    while (left < right) {
        const mid = Math.floor((left + right) / 2);
        // 不能舍去mid
        if (sortedArr[mid] > target) {
            right = mid;
        } else if (sortedArr[mid] <= target) {
            left = mid + 1;
        }
    }
    return right;
}

完整算法就不贴了,思路已经有了,具体实现就自己敲敲打打吧~

小结:滑动窗口的重点不是使窗口滑动就完事了,重点是下一窗口的滑动怎样利用上一窗口的“特性”,比如:有序;

滑动魔方

题目:在一个 2 x 3 的板上(board)有 5 块砖瓦,用数字 1~5 来表示, 以及一块空缺用 0 来表示.一次移动定义为选择 0 与一个相邻的数字(上下左右)进行交换. 最终当板 board 的结果是 [1,2,3,4,5,0] 谜板被解开。 给出一个谜板的初始状态,返回最少可以通过多少次移动解开谜板,如果不能解开谜板,则返回 -1 。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:board = [[1,2,3],[4,0,5]]
输出:1
解释:交换 051 步完成

输入:board = [[1,2,3],[5,4,0]]
输出:-1
解释:没有办法完成谜板

输入:board = [[4,1,2],[5,0,3]]
输出:5
解释:
最少完成谜板的最少移动次数是 5一种移动路径:
尚未移动: [[4,1,2],[5,0,3]]
移动 1 : [[4,1,2],[0,5,3]]
移动 2 : [[0,1,2],[4,5,3]]
移动 3 : [[1,0,2],[4,5,3]]
移动 4 : [[1,2,0],[4,5,3]]
移动 5 : [[1,2,3],[4,5,0]]

哇,这个读完题就能感觉到难度,有点像是玩魔方,把一个数组丢到一个算法里进行“旋转”,最后得出一共走了几步;

解题关键词:广度优先搜索(BFS);

直白来说就是穷举,每走一步,列出所有变化,然后与目标值匹配,如果没有,再多走一步,然后再穷举、匹配,搜索完成后,还没有匹配的,则返回 -1;

本题当中,由于是一个二维数组,所以,注意条件是 与一个相邻的数字(上下左右)进行交换

例如 0 所在的位置是 x,对于每一个与 x 相邻的位置 y,我们将 statusx 与 statusy 进行交换,即等同于进行了一次操作;

关键代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
// 枚举 status 通过一次交换操作得到的状态
    const get = (status) => {
        const ret = [];
        const array = Array.from(status);
        const x = status.indexOf('0');
        for (const y of neighbors[x]) {
            [array[x], array[y]] = [array[y], array[x]];
            ret.push(array.join(''));
            [array[x], array[y]] = [array[y], array[x]];
        }
        return ret;
    }
...

其实本题还有另一种思路:在很久前写过一篇《狄克斯特拉算法》,能给到一些启发~~ (●'◡'●) BFS,yyds!


OK,至此,我们前前后后通过滑动窗口认识了:单调队列、二分法、广度优先搜索;

有一说一,滑动窗口,有点东西!!

我是掘金安东尼,公众号同名,输出暴露输入,技术洞见生活,下次再会~~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
hostapd配置解析「建议收藏」
转载自:老丁的Linux:http://laoding.blog.51cto.com/980622/1697015
全栈程序员站长
2022/08/31
4.7K0
无线攻防:wifi攻防从破解到钓鱼
无线安全是信息安全体系下一门很广泛的学科,包括但并不仅限于近场(NFC)、蓝牙(Bluetooth) 、射频(radio frequency,RF) 、无线局域网(Wifi)、手机蜂窝网络(cellular) 、卫星定位(GPS)等。
FB客服
2021/08/24
7.6K1
一文读懂5G专网
5G专用网络(private 5G network)是一种局域网(LAN),它将使用5G技术创建具有统一连接性、优化服务和特定区域内安全通信方式的专用网络 。此前,机构曾预测2020年全球5G专网市场规模将达到9.197亿美元, 2020年至2027年间的复合年增长率将达到37.8%。而北美将以31.2%的份额在5G专网市场中占主导地位。
SDNLAB
2020/08/12
6.8K0
一文读懂5G专网
走进科学: 无线安全需要了解的芯片选型、扫描器使用知识
作者 LittleHann 目录 1. 无线安全研究需要的软硬件选型、及物理电气参数 2. 无线攻击第一步: "网络AP探测"、扫描器的使用 1. 无线安全研究需要的软硬件选型、及物理电气参数 在进行实际的无线安全攻击、研究之前,我们需要准备一些硬件设备、包括与之配套的软件。基本上来说,无线黑客技术需要涉及到以下几个组件 1. 底层芯片组 不论是USB网卡、PCI网卡、还是PCMCIA内置网卡,它们的核心都是"芯片组",即我们现在常说的卡皇、无线网卡的不同牌子, 本质上应该讨论它们内部使用的芯片组,我们要关
FB客服
2018/02/02
1.6K0
走进科学: 无线安全需要了解的芯片选型、扫描器使用知识
科普!WLAN定义、基本架构、射频、信道和标准协议
关于WLAN,相信大家对它早已不陌生了。几乎每天我们都能体验到WLAN给我们的生活带来的高效和便捷。在家里,通过无线路由器,我们不必再端端正正的坐在电脑旁,可以坐在沙发上,躺在床上,甚至可以坐在马桶上收发邮件,在线欣赏欧美大片,尽情享受摆脱有线束缚带来的自由。在候车室,手捧笔记本和Pad的人们正逐渐代替手捧报纸和杂志的人们。走进咖啡厅,越来越多的人第一件事不是点餐,而是询问咖啡厅无线网络的密码……。
网络工程师笔记
2021/05/17
2.5K0
科普!WLAN定义、基本架构、射频、信道和标准协议
【WiFi开发全攻略】WIFI常用工具汇总
本节主要介绍我们开发过程中,WiFi常用的开发工具,内容主要介绍工具种类以及基本的使用方法,更多使用可以见后面章节。
董哥聊技术
2024/04/03
3060
【WiFi开发全攻略】WIFI常用工具汇总
Exim CVE-2020-28018 漏洞分析
前段时间Exim突然出现了好多CVE[1],随后没多久Github上也出现了对CVE-2020-28018进行利用最后达到RCE的EXP和利用思路[2]。随后我也对该漏洞进行复现分析。
Seebug漏洞平台
2021/06/17
9510
玩转「Wi-Fi」系列之名词解读(二)
学习Wi-Fi 过程中有一些专有名词需要知道, 这对后续知识的了解有很大的帮助.这里针对常用的一些名词概念做解释.
程序手艺人
2019/02/21
1.6K0
嵌入式Linux开发板_WIFI无线网卡驱动移植
有线就插上网线,没什么好说的;无线的话一种是将WIFI模块集成焊接在板子上,另一种是WIFI模块以USB的方式接到板子上。
韦东山
2020/09/30
8K0
嵌入式Linux开发板_WIFI无线网卡驱动移植
hostapd.conf配置文档「建议收藏」
大家好,又见面了,我是你们的朋友全栈君。##### hostapd configuration file ############################################## # Empty lines and lines starting with # are ignored
全栈程序员站长
2022/09/03
2.4K0
【物联网】WiFi基础知识
目前有线网络中最著名的是以太网(Ethenet),但是无线网络WLAN是一个很有前景的发展领域,虽然可能不会完全取代以太网,但是它正拥有越来越多的用户,无线网络中最有前景的是Wifi。本文介绍无线网络相关内容。
杨源鑫
2020/05/21
1.4K0
Wi-Fi 总结
Wired Equivalency Protection,一种Wi-Fi连接的安全标准,类似的安全标准还包括下面的WPA,WPA2。它可以使用64/128bit的ASCII/HEX(0-9,A-F)的Password,它的密钥是由Password和一个IV(初始化向量)组成,加密算法是stream cipher RC4,并使用 CRC-32校验和确保完整性。加密解密过程如下:AP发送的数据包(包括IV和加密过的数据)–>无线客户端收到此数据包–>提取其中的IV,用于和本地的Password形成密钥–>解密数据包。它有两种鉴权方式:Open System, Shared Key.
iOSDevLog
2020/06/09
2K0
Wi-Fi 总结
写字楼WLAN网络解决方案设计
通常计算机组网的传输媒介主要依赖铜缆或光缆,构成有线局域网。但有线网络在某些场合要受到布线的限制:布线、改线工程量大;线路容易损坏;网中的各节点不可移动。对正在迅速扩大的连网需求形成了严重的瓶颈阻塞。WLAN就是解决有线网络以上问题而出现的, WLAN为Wireless LAN的简称,即无线局域网。无线局域网是利用无线技术实现快速接入以太网的技术。与有线网络相比,WLAN最主要的优势在于不需要布线,可以不受布线条件的限制。
ICT售前新说
2021/04/30
1.5K0
写字楼WLAN网络解决方案设计
hostapd.conf详细
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/143200.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/31
1.1K0
Linux 驱动开发:USB无线wifi驱动开发(MT7601)、完成WIFI管理工具安装
当前采用的WIFI是360随身WIFI,这款随身WIFI所用的网卡芯片是 Ralink(雷凌科技) 的解决方案(在上篇文章里也有详细介绍),芯片型号为 MT7601。 如果在PC计算机上使用这款随身WIFI那自然是简单,官网下载个驱动安装插上就能使用。 如果是在嵌入式平台,自动的平台上使用,官网就没有现成的驱动下载了,这种情况下就需要针对WIFI编写驱动。当然,从0开始写确实困难,不过这款芯片官方提供了linux下的驱动源码,这就好办了。只需要下载下来,编译就能使用了。
DS小龙哥
2022/10/31
12K0
Linux 驱动开发:USB无线wifi驱动开发(MT7601)、完成WIFI管理工具安装
黑客视角揭秘WiFi钓鱼,零信任带来防护突破
无线钓鱼是一个广受关注但难以根治的热点安全话题。本文中,我将以攻击者视角揭露无线钓鱼攻击的技术原理,包括DNS劫持、Captive Portal、JS缓存投毒等有趣的攻击利用。随后将探讨企业该如何帮助员工应对无线钓鱼攻击。企业内做钓鱼热点防护就够了吗?如何进行有效的无线安全意识培训?使用VPN就能抗住所有攻击?员工在非信任无线网络中进行远程办公是不可避免的安全挑战,零信任产品带来了更多的解决思路。
FB客服
2021/03/09
2.9K0
黑客视角揭秘WiFi钓鱼,零信任带来防护突破
WiFi技术概述:WiFi那些事
WLAN是无线局域网络的简称,全称为Wireless Local Area Networks,是一种利用无线技术进行数据传输的系统,该技术的出现能够弥补有线局域网络之不足,以达到网络延伸之目的。 Wi-Fi是无线保真的缩写,英文全称为Wireless Fidelity,在无线局域网才对范畴是指“无线兼容性认证”,实质上是一种商业认证,同时也是一种无线联网技术,与蓝牙技术一样,同属于在办公室和家庭中使用的短距离无线技术。同蓝牙技术相比,它具备更高的传输速率,更远的传播距离,已经广泛应用于笔记本、手机、汽车等广大领域中。 WIFI是无线局域网联盟的一个商标,该商标仅保障使用该商标的商品互相之间可以合作,与标准本身实际上没有关系,但因为WIFI 主要采用802.11b协议,因此人们逐渐习惯用WIFI来称呼802.11b协议。从包含关系上来说,WIFI是WLAN的一个标准,WIFI包含于WLAN中,属于采用WLAN协议中的一项新技术。 在WiFi使用之初,在安全性方面非常脆弱,很容易被别有用心的人截取数据包,所以在安全方面成了政府和商业用户使用WLAN的一大隐患。WAP(无线应用协议)是由我国制定的无线局域网中的安全协议,它采用国家密码管理委员会办公室批准的公开密钥体制的椭圆曲线密码算法和秘密密钥体制的分组密码算法,实现了设备的身份鉴别、链路验证、访问控制和用户信息在无线传输状态下的加密保护。2009年6月15日,在国际标准组织ISO/IECJTC1/SC6会议上,WAPI国际提案首次获得包括美、英、法等10余个与会国家成员体一致同意,将以独立文本形式推进其为国际标准,目前在中国加装WAPI功能的WIFI手机等终端可入网检测并获进网许可证。
全栈程序员站长
2022/09/16
2.5K0
Kubernetes 使用kubeadm创建集群
注意,安装docker时,需要指Kubenetes支持的版本(参见如下),如果安装的docker版本过高导致,会提示以下问题
授客
2021/09/26
3.4K0
《移动互联网技术》 第二章 无线网络技术: 掌握各种近距离通信的基本概念和工作原理
《移动互联网技术》课程是软件工程、电子信息等专业的专业课,主要介绍移动互联网系统及应用开发技术。课程内容主要包括移动互联网概述、无线网络技术、无线定位技术、Android应用开发和移动应用项目实践等五个部分。移动互联网概述主要介绍移动互联网的概况和发展,以及移动计算的特点。无线网络技术部分主要介绍移动通信网络(包括2G/3G/4G/5G技术)、无线传感器网络、Ad hoc网络、各种移动通信协议,以及移动IP技术。无线定位技术部分主要介绍无线定位的基本原理、定位方法、定位业务、数据采集等相关技术。Android应用开发部分主要介绍移动应用的开发环境、应用开发框架和各种功能组件以及常用的开发工具。移动应用项目实践部分主要介绍移动应用开发过程、移动应用客户端开发、以及应用开发实例。 课程的教学培养目标如下: 1.培养学生综合运用多门课程知识以解决工程领域问题的能力,能够理解各种移动通信方法,完成移动定位算法的设计。 2.培养学生移动应用编程能力,能够编写Andorid应用的主要功能模块,并掌握移动应用的开发流程。 3. 培养工程实践能力和创新能力。  通过本课程的学习应达到以下目的: 1.掌握移动互联网的基本概念和原理; 2.掌握移动应用系统的设计原则; 3.掌握Android应用软件的基本编程方法; 4.能正确使用常用的移动应用开发工具和测试工具。
猫头虎
2024/04/08
4500
《移动互联网技术》 第二章 无线网络技术: 掌握各种近距离通信的基本概念和工作原理
分布式存储_高性能RDMA网络_架构设计_性能调优参考_网卡排查命令_笔记
博客: https://logread.cn | https://blog.csdn.net/ssbandjl | https://cloud.tencent.com/developer/user/5060293/articles
晓兵
2023/11/03
4.8K0
分布式存储_高性能RDMA网络_架构设计_性能调优参考_网卡排查命令_笔记
推荐阅读
相关推荐
hostapd配置解析「建议收藏」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验