对于问题的具体描述可以查看https://leetcode-cn.com/problems/sliding-window-maximum/
下面是我的方案代码:
/**
* 思路:
* 1,首先,计算出第一个窗口的最大值windowMaxVal以及最大值对应的下标windowMaxIndex;
* 2,第二步,数组从i(i初始值为k)下标开始遍历数组:
* A,如果windowMaxIndex在窗口范围内,并且windowMaxVal>下标为i的数字,则直接范围;
* B,否则再次求出最大值与最大值的下标
* 3,算法复杂度为O(n)
* @param nums
* @param k
* @return
*/
public static int[] MaxSlidingWindow(int[] nums,int k){
if(nums == null || nums.length == 0 || k <1 || k > nums.length){
return null;
}
if(nums.length == 1){
return nums;
}
int windowMaxVal = nums[0];
int windowMaxIndex = 0;
int[] result = new int[nums.length - k+1];
for (int i = 1; i < k; i++) {
if(windowMaxVal < nums[i]){
windowMaxVal = nums[i];
windowMaxIndex = i;
}
}
result[0] = windowMaxVal;
for (int i = k; i < nums.length; i++) {
if(windowMaxIndex >= i-k+1 && windowMaxVal >= nums[i]){
result[i-k+1] = windowMaxVal;
}else{
windowMaxIndex = i-k+1;
windowMaxVal = nums[windowMaxIndex];
for (int j = i-k+2 ; j <=i ; j++) {
if(windowMaxVal < nums[j]){
windowMaxVal = nums[j];
windowMaxIndex = j;
}
}
result[i-k+1] = windowMaxVal;
}
}
return result;
}
然后提交到leetcode上的结果为:
以上是我提交的代码,后来有网友在后面回复,回复如下:
当时我觉得这个方案比较好,毕竟少了一个变量的操作,然后按照这个思路,对代码进行了修改,修改之后的代码如下:
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums == null || nums.length == 0 || k <1 || k > nums.length){
return null;
}
if(nums.length == 1){
return nums;
}
int windowMaxVal = nums[0];
int[] result = new int[nums.length - k+1];
for (int i = 1; i < k; i++) {
if(windowMaxVal < nums[i]){
windowMaxVal = nums[i];
}
}
result[0] = windowMaxVal;
for (int i = k; i < nums.length; i++) {
if(windowMaxVal== nums[i-k+1] && windowMaxVal >= nums[i]){
result[i-k+1] = windowMaxVal;
}else{
windowMaxVal = nums[i-k+1];
for (int j = i-k+2 ; j <=i ; j++) {
if(windowMaxVal < nums[j]){
windowMaxVal = nums[j];
}
}
result[i-k+1] = windowMaxVal;
}
}
return result;
}
然后将上面代码提交到leetCode上,结果却很意外:
感觉理论上会快很多,结果却是个意外:
第一次耗时2ms,第二次却变成了25ms。我就非常纳闷,没办法,只好对比2次代码的字节码。
对比了2次jvm字节码,发现在有最大值下标的情况下,代码:
这个代码执行只需要7步,而代码(蓝色框框):
执行却需要9个步骤,虽然相差2个步骤,但是在数据量大的情况下,差距却很大。
如果有问题,欢迎加我微信,一起讨论。只有一起交流才会有所收获,只有一起探讨,才会走得更远!!