Leetcode经典题20--长度最小的子数组

题目描述

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其总和大于等于 target 的长度最小的子数组

numsl, numsl+1, ..., numsr-1, numsr\] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 ##### 输入输出示例 **输入**:target = 7, nums = \[2,3,1,2,4,3

输出:2

解释:子数组 [4,3] 是该条件下的长度最小的子数组。

解决方案

方式一:滑动窗口
算法思想

定义两个指针 start 和 end 分别表示子数组(滑动窗口窗口)的开始位置和结束位置,维护变量 sum 存储子数组中的元素和(即从 nums[start] 到 nums[end] 的元素和)。

初始状态下,start 和 end 都指向下标 0,sum 的值为 0。

每一轮迭代,将 nums[end] 加到 sum,如果 sum≥s,则更新子数组的最小长度(此时子数组的长度是 end−start+1),然后将 nums[start] 从 sum 中减去并将 start 右移,直到 sum

实现代码
复制代码
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int n=nums.length;
        if(n==0){
            return 0;
        }
        int ans=Integer.MAX_VALUE;
        int start=0,end=0;//窗口的左边界和右边界
        int sum=0;//窗口的元素和
        while(end<n){
          //向右滑动
          sum+=nums[end];
          //当窗口内的元素和大于等于目标值,缩小窗口
          while(sum>=target){
            ans=Math.min(ans,end-start+1);
            sum-=nums[start];
            start++;
          }
          //否则扩大窗口
          end++;
        }
        //考虑达不到目标值的情况
        return ans==Integer.MAX_VALUE?0:ans;
    }
}
复杂度分析

时间复杂度:O(n),其中 n 是数组的长度。指针 start 和 end 最多各移动 n 次。

空间复杂度:O(1)。

相关推荐
仰泳的熊猫1 小时前
LeetCode:538. 把二叉搜索树转换为累加树/1038. 从二叉搜索树到更大和树
数据结构·c++·算法·leetcode
weixin_307779131 小时前
Clickhouse导出库的表、视图、用户和角色定义的SQL语句
开发语言·数据库·算法·clickhouse·自动化
piggy侠1 小时前
【GitHub每日速递 251016】23k star,Daytona:90ms内极速运行AI代码,安全弹性基础设施来袭!
算法·github
小龙报2 小时前
《算法通关指南---C++编程篇(1)》
开发语言·c++·程序人生·算法·学习方法·visual studio
在繁华处2 小时前
C语言初步学习:数组的增删查改
c语言·数据结构·学习
月夜的风吹雨2 小时前
【数据结构】:C 语言常见排序算法的实现与特性解析
c语言·数据结构·排序算法
Cx330❀2 小时前
《C++ 手搓list容器底层》:从结构原理深度解析到功能实现(附源码版)
开发语言·数据结构·c++·经验分享·算法·list
Swift社区2 小时前
LeetCode 399 除法求值
算法·leetcode·职场和发展
仰泳的熊猫2 小时前
LeetCode:98. 验证二叉搜索树
数据结构·c++·算法·leetcode
JAVA学习通2 小时前
零基础OSS组件(Java)
java·linux·leetcode