Leetcode 862
找到最短的连续子数组的和至少为k
维护前缀和b,那么要我们要找的就是满足b[i] - b[j] >=k 的最大的j是多少,朴素的实现的话复杂度是O(N^2)的
注意到如果前缀和b[x] >= b[y](x < y)的话,那么x永远不可能成为解,因为这个时候如果x满足 b[i] - b[x] >= k的话,
那么j也一定满足b[i] - b[y] >= k,并且y和i组成的数组要比x和i组成的数组更短
因此候选的解一定是一定(严格)单调上升的序列,我们可以用一个双端队列来实现
具体的话
每次入队的时候,如果当前和比队尾的和大,就一直出队
寻找解的时候,从队首一直向后找,找到最大的下标即可,之前的就可以出队了,因为他们后面也不可能成为更优的解了。
每个下标最多都只会进队和出队一次,复杂度是O(N)
public int shortestSubarray(int[] A, int K) {//单调队列,维护前缀和B[], 如果 B[i] >= B[j], 那么i永远不可能成为最有解int len = A.length;int[] b = new int[len + 1];for (int i = 1; i <= len; i++) b[i] = b[i - 1] + A[i - 1];int res = Integer.MAX_VALUE;//d是一个双端队列,维护的是b数组的下标Deque<Integer> d = new ArrayDeque<>();d.add(0);for (int i = 1; i <= len; i++) {while (!d.isEmpty() && b[i] - b[d.getFirst()] >= K) {res = Math.min(res, i - d.getFirst());d.pollFirst();}//根据上述的性质,队列维护的前缀和一定是一个(严格)单调上升的while (!d.isEmpty() && b[i] <= b[d.getLast()]) {d.pollLast();}d.add(i);}return res == Integer.MAX_VALUE ? -1 : res;}
Leetcode 862相关推荐
- ⭐算法入门⭐《队列 - 单调队列》困难03 —— LeetCode 862. 和至少为 K 的最短子数组
文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述 返回数组 AAA 的最 ...
- LeetCode 862. 和至少为 K 的最短子数组(前缀和+deque单调栈)
1. 题目 返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K . 如果没有和至少为 K 的非空子数组,返回 -1 . 示例 1: 输入:A = [1], K = 1 输出:1示例 2: ...
- LeetCode 862 题解
https://leetcode.com/problems/shortest-subarray-with-sum-at-least-k/description/ 题目大意:求满足数组内,连续和至少为K ...
- LeetCode 974. 和可被 K 整除的子数组(哈希map)
1. 题目 给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续.非空)子数组的数目. 示例: 输入:A = [4,5,0,-2,-3,1], K = 5 输出:7 解释: 有 7 个子数组满 ...
- LeetCode 560. 和为K的子数组(前缀和差分)
1. 题目 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1 ...
- LeetCode 523. 连续的子数组和(求余 哈希)
1. 题目 给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数. 示例 1: 输入 ...
- 2020云栖大会编程限时抢答赛 - 早中晚3场题解
文章目录 1. 云栖大会限时抢答赛 - 早间场 2. 云栖大会限时抢答赛 - 午间场 3. 云栖大会限时抢答赛 - 晚间场 1. 云栖大会限时抢答赛 - 早间场 题目链接 该场次题目在 LeetCod ...
- 算法学习 (门徒计划)4-1 单调队列及经典问题及经典例题 学习笔记
算法学习 (门徒计划)4-1 单调队列及经典问题及经典例题 学习笔记 前言 单调队列 场景举例(RMQ) 应用-维护区间最值的方式 数据结构-自行设计单调队列 代码实现(java) 例题分析(略) 总 ...
- taoqick 搜索自己CSDN博客
L1 L2正则化和优化器的weight_decay参数 kaiming初始化的推导 Pytorch动态计算图 Pytorch自动微分机制 PyTorch中在反向传播前为什么要手动将梯度清零? 通俗讲解 ...
最新文章
- Oracle用户被锁定解决方法
- [原译]11个高效的VS调试技巧
- 什么是7层负载均衡?
- 获取当前文件所在路径
- mysql中max_allowed_packet参数的配置方法(避免大数据写入或者更新失败)
- Ubuntu安装C++环境(VsCode 编译器)
- 深入浅出MySql索引
- linux内核无锁cas,无锁编程以及CAS
- 被收割的人,是拦不住的
- mac php pear pecl,mac 安装 pecl pear
- Learning through Auxiliary Tasks——辅助任务学习or自监督学习中的pretext
- JAVA+MySQL 图书馆借阅信息管理系统
- [1-3] 把时间当做朋友(李笑来)Chapter 3 【提高心智,和时间做朋友】 摘录
- x264参数与代码对应
- 抓包工具以及如何看抓包信息
- 硅谷始祖-仙童半导体浮沉录
- Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API
- OneDrive和OneDrive for Business映射到本地网络驱动器
- 开票系统OFD如何转换PDF格式
- 前端制作简单的“注册页面——阅读协议”页面及效果