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 分钟前
【开题答辩全过程】以 走失儿童寻找平台为例,包含答辩的问题和答案
java
风之歌曲38 分钟前
c++高精度模板
c++·算法·矩阵
SWAGGY..39 分钟前
数据结构学习篇(10)--- 二叉树基础oj练习
数据结构·学习
千谦阙听43 分钟前
双链表:比单链表更高效的增删查改
数据结构·链表·visual studio
他们叫我技术总监44 分钟前
Python 列表、集合、字典核心区别
android·java·python
江沉晚呤时1 小时前
从零实现 C# 插件系统:轻松扩展应用功能
java·开发语言·microsoft·c#
嵌入式进阶行者1 小时前
【算法】深度优先搜索实例:华为OD机考双机位A卷- 中庸行者
c++·算法·华为od·深度优先
梁下轻语的秋缘1 小时前
ESP32-WROOM-32E存储全解析:RAM/Flash/SD卡读写与速度对比
java·后端·spring
a3535413821 小时前
参数化曲线弧长公式推导
算法
wanzhong23331 小时前
开发日记8-优化接口使其更规范
java·后端·springboot