【LeetCode】862. 和至少为 K 的最短子数组
862. 和至少为 K 的最短子数组
知识点:单调;队列;前缀和
题目描述
返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K 。
如果没有和至少为 K 的非空子数组,返回 -1 。
示例
输入:A = [1], K = 1
输出:1
输入:A = [1,2], K = 4
输出:-1
输入:A = [2,-1,2], K = 3
输出:3
解法一:单调队列+前缀和
这个题目是求连续子数组,所以自然可以想到前缀和,也就是用一个数组统计到第i个位置的前缀和。所以问题就变成了
j>i && preSum[j] - preSum[i] >= k && (j-i) 最小
可以通俗的理解,就像排队,我需要找到前面比我矮最少k的人,而且想让我和这个人的距离最近;
双端递增队列:对于当前的“我”来说,if前面的人比我高,那我的身高减去前面高的人,值肯定为负数,那就可以直接弹走了,(那可能会有个问题,这就直接弹走了?那要是之后来的要是比上一个更小,比之前弹出的更大那咋整,你想想,这不正好吗?首先刚进去的这个肯定更小,if弹走的满足,那这个更满足了,其次,这个离得也更近啊,所以可以大胆的弹),那现在队列里剩下的都是比我矮的人了,if第一个和我的身高差值小于k,那后面就更小于k了;if队首和我的身高相比差值大于k,那就可以去当做一个答案记录了,并且可以把这个值弹出,然后比较新的队首了,(为什么可以弹走呢?因为后来的无论和队首比满不满足,那都没用,因为肯定我离之前那个同学更近啊);
class Solution {
public int shortestSubarray(int[] nums, int k) {
int n=nums.length,res=n+1;
//双端队列;
LinkedList<Integer> list=new LinkedList<>();
int[] pre=new int[n+1];
for(int i=1;i<=n;i++)
//得到前缀和;
pre[i]=pre[i-1]+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;
}
}
【LeetCode】862. 和至少为 K 的最短子数组的更多相关文章
- 和至少为K的最短子数组
返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K 如果没有和至少为 K 的非空子数组,返回 -1 . 示例 1: 输入:A = [1], K = 1 输出:1 示例 2: 输入:A = ...
- [LeetCode] 862. Shortest Subarray with Sum at Least K 和至少为K的最短子数组
Return the length of the shortest, non-empty, contiguous subarray of A with sum at least K. If there ...
- Leetcode 974 和可被K整除的子数组
题目: 解法 //前缀和算法+hash表 class Solution { public: int subarraysDivByK(vector<int>& A, int K) { ...
- [Swift]LeetCode862. 和至少为 K 的最短子数组 | Shortest Subarray with Sum at Least K
Return the length of the shortest, non-empty, contiguous subarray of A with sum at least K. If there ...
- 【LeetCode】974. 和可被 K 整除的子数组
974. 和可被 K 整除的子数组 知识点:数组:前缀和: 题目描述 给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续.非空)子数组的数目. 示例 输入:A = [4,5,0,-2,-3, ...
- 209 Minimum Size Subarray Sum 大于给定和最短子数组
给定一个含有 n 个正整数的数组和一个正整数 s , 找到一个最小的连续子数组的长度,使得这个子数组的数字和 ≥ s .如果不存在符合条件的子数组,返回 0.举个例子,给定数组 [2,3,1,2,4 ...
- 974.和可被K整除的子数组
题目 给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续.非空)子数组的数目. 示例: 输入:A = [4,5,0,-2,-3,1], K = 5 输出:7 解释: 有 7 个子数组满足其元 ...
- 【LeetCode/LintCode】 题解丨字节跳动试题:第k大的子数组
给定一个长度为n的数组a,它有n(n+1)/2个子数组.请计算这些子数组的和,然后按照升序排列,并返回排序后第k个数. 1≤n≤10^5 1≤ai≤10^9 1≤k≤n(n+1)/2 在线 ...
- 算法——和为K的连续子数组
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况. 链 ...
随机推荐
- C++利用模板在Windows上快速调用DLL函数
更新日志 --------- 2021/08/01 更新V2.2 增加 GetHmodule 函数 - 允许用户获取HMODULE以验证加载DLL是否成功. 2021/08/03 更新V2.3 增加 ...
- Python语言系列-10-数据库
MySQL 基础环境准备 readme.txt 作者:Alnk(李成果) 版本:v1.0 安装mysql数据库 略 创建student库 # mysql> create database stu ...
- Java之JSTL标签与JavaBean
Java之JSTL标签与JavaBean JSP.JSTL标签及 EL表达式 <!-- jstl表达式--> <dependency> <groupId>javax ...
- Redis应用场景及缓存问题
1.应用场景 (1) 缓存 缓存机制几乎在所有的大型网站都有使用,合理地使用缓存不仅可以加快数据的访问速度,而且能够有效地降低后端数据源的压力.Redis 提供了键值过期时间设置,并且也提供了灵活 ...
- Slope Trick:解决一类凸代价函数DP优化
[前言] 在补Codeforce的DP时遇到一个比较新颖的题,然后在知乎上刚好 hycc 桑也写了这道题的相关题解,这里是作为学习并引用博客的部分内容 这道题追根溯源发现2016年这个算法已经在API ...
- Xilinx约束学习笔记(一)—— 约束方法学
<Xilinx约束学习笔记>为自己阅读 Xilinx 官方 UG903 文档后的学习笔记,大多数为翻译得来,方便大家学习. 1 约束方法学 1.1 组织约束文件 Xilinx 建议将时序约 ...
- deepin下zerotier组网
环境:deepin 1.安装zerotier curl -s https://install.zerotier.com/ | sudo bash 官网也是有的 安装完成之后进行内网连接 sudo ze ...
- ☕【Java技术指南】「OpenJDK专题」想不想编译属于你自己的JDK呢?(Windows10环境)
Win10下编译OpenJDK8 编译环境 Windows10专业版64位: 编译前准备 Tip: 以下软件的安装和解压目录尽量不要包含中文或空格,不然可能会出现问题 安装 Visual Studio ...
- ReentrantLock可重入锁lock,tryLock的区别
void lock(); Acquires the lock. Acquires the lock if it is not held by another thread and returns im ...
- 8、二进制安装K8s之部署CIN网络
二进制安装K8s之部署CIN网络 部署CIN网络可以使用flannel或者calico,这里介绍使用calico ecd 方式部署. 1.下载calico二进制安装包 创建所需目录 mkdir -p ...