LeetCode862 和至少为k的最短子数组

题目:

解析:

1、先构造前缀和数组

2、单调队列存放滑动窗口,目的求Sj-Si >=k的情况下,窗口最小。

代码:

java 复制代码
class Solution {
    public int shortestSubarray(int[] nums, int k) {
        int n = nums.length;
        long[] sums = new long[n + 1];      // 注意这里加和后,容易超过int,加和用long数组
        for (int i = 1; i <= n; i++) {
            sums[i] = sums[i - 1] + nums[i - 1];
        }

        Deque<Integer> deque = new LinkedList<>();
        deque.add(0);

        int res = Integer.MAX_VALUE;

        for (int i = 1; i <= n; i++) {
            while (!deque.isEmpty() && sums[i] - sums[deque.peek()] >= k) { // 注意边界,求最小这里应该 >=
                res = Math.min(res, i - deque.poll());
            }

			//将所有大于等于s[i]的数删掉 问题:这里不删能怎么样,上面求最小值会守影响么?
            while (!deque.isEmpty() && sums[deque.peekLast()] >= sums[i]) {  // 注意边界,求最小这里应该 >=
                deque.pollLast();
            }

            deque.add(i);
        }

        if (res == Integer.MAX_VALUE) {
            return -1;
        }

        return res;
    }
}
相关推荐
快乐肚皮5 分钟前
MySQL递归CTE
java·数据库·mysql·递归表达式
廋到被风吹走9 分钟前
【Spring】DispatcherServlet解析
java·后端·spring
廋到被风吹走17 分钟前
【Spring】PlatformTransactionManager详解
java·spring·wpf
2301_8002561117 分钟前
地理空间数据库中的CPU 和 I/O 开销
数据库·算法·oracle
wanghowie1 小时前
01.07 Java基础篇|函数式编程与语言新特性总览
java·开发语言·面试
Cricyta Sevina1 小时前
Java IO 基础理论知识笔记
java·开发语言·笔记
一个不知名程序员www1 小时前
算法学习入门---结构体和类(C++)
c++·算法
小萌新上大分1 小时前
java线程通信 生产者消费者,synchronized,,ReentrantLock,Condition(笔记备份)
java·多线程·lock·java线程间通信的方式·reentrantlock使用·生产者消费者问题java·java多线程与高并发
それども2 小时前
Spring Bean 的name可以相同吗
java·后端·spring
墨雪不会编程2 小时前
C++ string 详解:STL 字符串容器的使用技巧
java·开发语言·c++