主題の要件
整数の配列numsが与えられると、配列の左端から右端に移動するサイズkのスライディングウィンドウがあります。スライディングウィンドウにはk個の数字しか表示されません。スライディングウィンドウは、一度に1つの位置だけ右に移動します。
スライディングウィンドウの最大値を返します。
例1:
入力:nums = [1,3、-1、-3,5,3,6,7]、k = 3
出力:[3,3,5,5,6,7]
説明:
スライディングの最大位置窓
[1 3 -1] -3 5 3 6 7 3
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 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
例2:
入力:nums = [1]、k = 1
出力:[1]
例3:
入力:nums = [1、-1]、k = 1
出力:[1、-1]
例4:
入力:nums = [9,11]、k = 2
出力:[11]
例5:
入力:nums = [4、-2]、k = 2
出力:[4]
促す:
1 <= nums.length <= 105
-104 <= nums [i] <= 104
1 <= k <= nums.length
問題解決のアイデア
1.最初に戻り値の数を決定します
2.
最初のk個の数値の最大値を見つけます3.1最大値が最初の数値の場合、ウィンドウを次の数値に押して、もう一度最大値を見つけます
3.2最大値がそうでない場合最初のウィンドウを次の番号にプッシュする場合、最大番号と次の番号のどちらが大きいかを判断するだけで済みます。
4結果
psを返します(k個の数値に複数の最大値がある場合は最大値検索、最後の位置が最大値であり、後で計算量を減らします)
問題解決コード
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int[] res=new int[nums.length-(k-1)];//用来存放结果
int[] max1 = findMax(nums, 0, k);//找出最大值,和最大值的位置
int max= max1[0];//最大值存入max变量中
res[0]=max;//结果数组第一个值确定下来
int flag =k;
while (flag <nums.length)循环之后变量,找出每一回推的最大值
{
if(max1[1]==flag-k)//如果最大值是第一个值,则重新找最大值
{
max1=findMax(nums,flag-k+1,k);
max=max1[0];
res[flag -k+1]=max;
}
else if(nums[flag]>=max)
{
res[flag -k+1]=nums[flag];
max=nums[flag];
}
else
{
res[flag -k+1]=max;
}
flag++;
}
return res;
}
public int[] findMax(int[] nums,int s,int k)
{
int r =-1;//用来判断是否是第一个数
int maxElem=Integer.MIN_VALUE;//找出最大值
for (int i = s; i < s+ k; i++) {
if(maxElem<=nums[i])
{
maxElem=nums[i];
r =i;
}
}
return new int[]{maxElem, r};
}
}
効果
情報の
回答は成功しました:
実行時間:773ミリ秒、Javaユーザーの5.06%を打ち負かしました
メモリ消費量:59.3 MB、Javaユーザーの8.71%を打ち負かしました