Leetcode 239 Silding Window Maximum(滑動視窗的最大值)
阿新 • • 發佈:2019-01-09
一,問題描述
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();
}
}
執行結果: