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 的最短子数组的更多相关文章

  1. 和至少为K的最短子数组

    返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K 如果没有和至少为 K 的非空子数组,返回 -1 . 示例 1: 输入:A = [1], K = 1 输出:1 示例 2: 输入:A =  ...

  2. [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 ...

  3. Leetcode 974 和可被K整除的子数组

    题目: 解法 //前缀和算法+hash表 class Solution { public: int subarraysDivByK(vector<int>& A, int K) { ...

  4. [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 ...

  5. 【LeetCode】974. 和可被 K 整除的子数组

    974. 和可被 K 整除的子数组 知识点:数组:前缀和: 题目描述 给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续.非空)子数组的数目. 示例 输入:A = [4,5,0,-2,-3, ...

  6. 209 Minimum Size Subarray Sum 大于给定和最短子数组

    给定一个含有 n 个正整数的数组和一个正整数 s , 找到一个最小的连续子数组的长度,使得这个子数组的数字和 ≥  s .如果不存在符合条件的子数组,返回 0.举个例子,给定数组 [2,3,1,2,4 ...

  7. 974.和可被K整除的子数组

    题目 给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续.非空)子数组的数目. 示例: 输入:A = [4,5,0,-2,-3,1], K = 5 输出:7 解释: 有 7 个子数组满足其元 ...

  8. 【LeetCode/LintCode】 题解丨字节跳动试题:第k大的子数组

    给定一个长度为n的数组a,它有n(n+1)/2​​个子数组.请计算这些子数组的和,然后按照升序排列,并返回排序后第k个数. 1≤n≤10​^5 1≤a​i≤10^​9 1≤k≤​n(n+1)/2 在线 ...

  9. 算法——和为K的连续子数组

    给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况. 链 ...

随机推荐

  1. C++利用模板在Windows上快速调用DLL函数

    更新日志 --------- 2021/08/01 更新V2.2 增加 GetHmodule 函数 - 允许用户获取HMODULE以验证加载DLL是否成功. 2021/08/03 更新V2.3 增加 ...

  2. Python语言系列-10-数据库

    MySQL 基础环境准备 readme.txt 作者:Alnk(李成果) 版本:v1.0 安装mysql数据库 略 创建student库 # mysql> create database stu ...

  3. Java之JSTL标签与JavaBean

    Java之JSTL标签与JavaBean JSP.JSTL标签及 EL表达式 <!-- jstl表达式--> <dependency> <groupId>javax ...

  4. Redis应用场景及缓存问题

    1.应用场景 (1)   缓存 缓存机制几乎在所有的大型网站都有使用,合理地使用缓存不仅可以加快数据的访问速度,而且能够有效地降低后端数据源的压力.Redis 提供了键值过期时间设置,并且也提供了灵活 ...

  5. Slope Trick:解决一类凸代价函数DP优化

    [前言] 在补Codeforce的DP时遇到一个比较新颖的题,然后在知乎上刚好 hycc 桑也写了这道题的相关题解,这里是作为学习并引用博客的部分内容 这道题追根溯源发现2016年这个算法已经在API ...

  6. Xilinx约束学习笔记(一)—— 约束方法学

    <Xilinx约束学习笔记>为自己阅读 Xilinx 官方 UG903 文档后的学习笔记,大多数为翻译得来,方便大家学习. 1 约束方法学 1.1 组织约束文件 Xilinx 建议将时序约 ...

  7. deepin下zerotier组网

    环境:deepin 1.安装zerotier curl -s https://install.zerotier.com/ | sudo bash 官网也是有的 安装完成之后进行内网连接 sudo ze ...

  8. ☕【Java技术指南】「OpenJDK专题」想不想编译属于你自己的JDK呢?(Windows10环境)

    Win10下编译OpenJDK8 编译环境 Windows10专业版64位: 编译前准备 Tip: 以下软件的安装和解压目录尽量不要包含中文或空格,不然可能会出现问题 安装 Visual Studio ...

  9. ReentrantLock可重入锁lock,tryLock的区别

    void lock(); Acquires the lock. Acquires the lock if it is not held by another thread and returns im ...

  10. 8、二进制安装K8s之部署CIN网络

    二进制安装K8s之部署CIN网络 部署CIN网络可以使用flannel或者calico,这里介绍使用calico ecd 方式部署. 1.下载calico二进制安装包 创建所需目录 mkdir -p ...