一,问题描述
1,给定一个整数数组nums 和一个正整数k的滑动窗口,滑动窗口每次从左到右移动一个数字,返回每次滑动窗口中的最大值。
2,例如:
输入: nums=[1,3,-1,-3,5,3,6,7] k=3
输出: 3, 3 ,5, 5,6 ,7
3,解题思路:
首先判断数组的长度len与k的大小,如果len<=k,则,只要找出数组nums中最大的那个值,直接返回就可以了。如果len>k的话,则定义一个数组data,其长度为len-k+1。然后对于原数组nums从下标0开始扫描,扫描到第len-k+1个元素停止。指针每次指向一个元素时,设该元素下标为begin,它的窗口的最后一个元素的下标设置为end。然后在[begin,end]中找到最大的元素,把该元素放在data[]里面,每次移动都按照上述操作,最后返回data。
二,AC了的程序(用JAVA实现的)
import java.util.*;
public class Test2{
public int[] maxSlidingWindow(int []nums,int k)
{
if(nums==null||nums.length==0)
{
return new int[0]; //直接返回0;
}
int len=nums.length;
int temp=Integer.MIN_VALUE;
if(len<=k) //如果数组的长度小于等于k,只要返回数组中最大值就好
{
int []data=new int[1];
for(int i=0;i<len;i++)
{
if(temp<nums[i])
{
temp=nums[i];
}
}
data[0]=temp;
return data;
}
else //当len的值大于k时,
{
int []data=new int[len-k+1];
for(int i=0;i<=len-k+1;i++)
{
temp=Integer.MIN_VALUE;
int begin=i;
int end=i+k;
//System.out.println("begin="+begin);
//System.out.println("end="+end);
if(end<=len)
{
for (int j = begin; j < end; j++) {
if (temp < nums[j]) {
temp = nums[j];
}
}
data[i] = temp;
}
else
{
i=len;
}
}
return data;
}
}
public static void main(String []args)
{
Test2 test=new Test2();
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int []nums=new int[n];
for(int i=0;i<n;i++)
{
nums[i]=scan.nextInt();
}
int k=scan.nextInt();
int []result=test.maxSlidingWindow(nums,k);
for(int i=0;i<result.length;i++)
{
System.out.print(result[i]+" ");
}
System.out.println();
}
}
运行结果: