力扣打卡第四天 和至少为 K 的最短子数组

和至少为 K 的最短子数组

给你一个整数数组 nums 和一个整数 k ,找出 nums 中和至少为 k 的 最短非空子数组 ,并返回该子数组的长度。如果不存在这样的 子数组 ,返回 -1 。

子数组 是数组中 连续 的一部分。

class Solution {

    public int shortestSubarray(int[] nums, int k) {

        int n=nums.length,res=n+1;

        LinkedList<Integer> list=new LinkedList<>();

        long[] pre=new long[n+1];

        for(int i=1;i<=n;i++)

            pre[i]=pre[i-1]+(long)nums[i-1];

        for(int i=0;i<n+1;i++)

        {

            while(!list.isEmpty()&&pre[i]<pre[list.getLast()])

                list.removeLast();

            while(!list.isEmpty()&&pre[i]-pre[list.getFirst()]>=k)

            {

                res=Math.min(res,i-list.removeFirst());

            }

            list.add(i);

        }

        return res==n+1?-1:res;

    }

}

猜你喜欢

转载自blog.csdn.net/qq_46157589/article/details/127533651