leetcode滑动窗口最大值的意外收获

对于问题的具体描述可以查看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个步骤,但是在数据量大的情况下,差距却很大。 

如果有问题,欢迎加我微信,一起讨论。只有一起交流才会有所收获,只有一起探讨,才会走得更远!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值