题目描述
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
思路分析
- 当窗口大小为1的时候,返回数组本身
- 遍历得到滑动窗口,对得到的滑动窗口进行排序,并返回当前窗口的最大值
3.其中,最后一个滑动窗口的起始位置为num.length-1;
知识点 参考链接
js数组的sort()方法用于对数组的元素进行排序,并返回数组。默认排序顺序是根据字符串Unicode码点。
语法:arrayObject.sort(sortby);参数sortby可选。规定排序顺序。必须是函数。
注:如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于 b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。
//升序排序
function sortNumber(a,b)
{
return a - b
}
//降序排序
function sortNumber(a,b)
{
return b - a
}
V8 引擎 sort 函数只给出了两种排序 InsertionSort 和 QuickSort,数量小于10的数组使用 InsertionSort,比10大的数组则使用 QuickSort。
代码实现
function maxInWindows(num, size)
{
// write code here
let maxNums=[];
if(size<=0 || size>num.length){
return maxNums;
}
if(size===1){
return num;
}
let j=num.length-size;
let max=0;
for(let i=0;i<=j;i++){
let window=num.slice(i,size+i);
max=maxSingleWindow(window);
maxNums.push(max);
}
return maxNums;
}
function maxSingleWindow(num){
if(num.length>0){
num=num.sort(sortNum);
return num[num.length-1];
}
}
function sortNum(a,b){
return a-b;
}