【刷题】Leetcode 862. Shortest Subarray with Sum at Least K

暴力解

class Solution {
    public int shortestSubarray(int[] A, int K) {
        int[] P = new int[A.length + 1];
        for(int i = 0; i < A.length; i++){
            P[i + 1] = P[i] + A[i];
        }
        int min = P.length;
        for(int i = 1; i < P.length; i ++){
            for(int j = i - 1; j >= 0; j--){
                if(P[i] - P[j] >= K && i - j< min)
                    min = i - j;
            }
        }
        return min == P.length ? -1 : min;
        
    }
}
 public int shortestSubarray(int[] A, int K) {
       int minLen = A.length + 1;
	         int[] preSum = new int[A.length + 1];
	         preSum[0] = 0;
	         for (int i = 0; i < A.length; i++) {
	             preSum[i + 1] = preSum[i] + A[i];
	         }
	         Deque<Integer> deque = new LinkedList<>();
	         for (int i = 0; i < A.length + 1; i++) {
	             while (!deque.isEmpty() && preSum[i] <= preSum[deque.getLast()]) {
	                 // 1.
	                 deque.pollLast();
	             }

	             while (!deque.isEmpty() && preSum[i] - preSum[deque.getFirst()] >= K) {
	                 // 2.
	                 int new_len = i - deque.pollFirst();
	                 if (new_len < minLen) {
	                     minLen = new_len;
	                 }
	             }

	             deque.addLast(i);
	         }
	         return minLen == A.length + 1 ? -1 : minLen;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值