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. 100的累加和 while 循环

    //100的累加和 while 循环 #include <stdio.h> int main() { int sum = 0; //5050 int i = 0; while(i < ...

  2. javaSE基础之变量,常量,作用域和运算符

    变量 变量是什么? 变量是可以变化得量 Java是一种强类型语言,每个变量都必须声明其类型. Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域 type varName [=v ...

  3. GUI编程简介

    GUI编程(淘汰) GUI编程怎么学? 这是什么 它怎么玩 该如何去在我们平时运用 class -- 可阅读 组件 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 鼠标 键盘事件 破解工具 1 ...

  4. solr7.4.0+mysql+solrj(简而优美)

    目录: 1 solr7部署+创建核心2 solr mysql 连接 2.1 导入相关 jar包 2.2 配置连接信息 2.3 配置中文分析器3 solrj JAVA客户端应用 3.1 solrj 构建 ...

  5. Java 多线程与并发【原理第二部分笔记】

    Java 多线程与并发[原理第二部分笔记] 什么是Java内存模型中的happens-before Java内存模型,即JMM,本身是一种抽象的概念,并不是真实存在的,他描述的是一组规则或者说是一种规 ...

  6. ApiPost进阶教程(1) — 在ApiPost中使用脚本

    什么是APIPOST脚本 APIPOST脚本是基于JavaScript语言的代码片段,可实现在接口请求或集合测试时添加动态行为. 脚本可实现的功能 测试(断言)请求返回结果的正确性(后置脚本). 动态 ...

  7. Redis如何实现分布式锁

    今天我们来聊一聊分布式锁的那些事. 相信大家对锁已经不陌生了,我们在多线程环境中,如果需要对同一个资源进行操作,为了避免数据不一致,我们需要在操作共享资源之前进行加锁操作.在计算机科学中,锁(lock ...

  8. JavaSE-方法

    何谓方法 比如之前用到的 System.out.println(); System为一个类:out为这个类的一个输出对象:println()为这个对象的方法 调用System类中out输出对象的pri ...

  9. sqli-labs lesson 21-22

    less 21: username:admin password:admin 登录. 发现这里和之前不太一样.用到了base64加密而不是之前的明文了. 传送门:base64在线编码解码 所以要做的就 ...

  10. WooYun虚拟机的搭建及配置方法

    "当时代需要时,他们勇敢地站了出来.当潮水褪去时,他们等待新的使命.他们等待被抛弃或者被怀念,等待这个世界告诉他们善恶和对错." 记录一下复活乌云的过程. 第一步:虚拟机下载 网上 ...