1. 程式人生 > >Leetcode 239 Silding Window Maximum(滑動視窗的最大值)

Leetcode 239 Silding Window Maximum(滑動視窗的最大值)

一,問題描述
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(); } }

執行結果:
這裡寫圖片描述