长度最小的子数组题目详解(Java版)

 更新时间:2023年12月26日 16:02:33   作者:楠枬  
这篇文章主要给大家介绍了关于长度最小的子数组(Java版)的相关资料,这到题来自力扣,通过学习本文对大家理解这道题目有很大的帮助,需要的朋友可以参考下

题目描述

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

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。

示例:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
输入:target = 4, nums = [1,4,4]
输出:1

题解

思路分析

题目要求我们找到和 >= target 最小连续 的子数组,我们很容易想到暴力枚举的方法,即访问数组的每一个元素i,并将i作为第一个元素,向后寻找

暴力枚举代码

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int count = 0;
        for(int i = 0; i < nums.length; i++){
            int sum = 0;
            //向后遍历找到以nums[i]为起始元素的最小数组
            for(int j = i; j < nums.length;j++){
                sum += nums[j];
                if(sum >= target){
                     //更新目标值 由于count的初始值为0,因此需要更新初始值,
                     //否则最小值恒为0
                    if(count > j-i+1 || count == 0){
                        count = j-i+1;
                    }
                    break;
                }
            }
        }
        //若count未被更新,则返回0,即没有子数组的和大于target,
        //若count被跟新,则返回最小的子数组长度
        return count;
    }
}

此时我们通过遍历访问了数组的每个元素,在访问每个元素时,以该元素为起始元素,并向后寻找其最小长度的子数组,因此时间复制度为O(^{_N{2}})

而,题目所给的数组中所有元素均是正整数,因此每加上一个元素,子数组的和 sum 增加,通过这个特性,我们可以想到使用滑动窗口来解决这个问题

什么是滑动窗口?

滑动窗口是一种基于双指针的思想,两个指针指向的元素之间形成了一个窗口

因此滑动窗口是通过两个指针来维护的,那么如何移动这两个指针,是使用滑动窗口解决问题的关键

 初始时,两个指针都指向0下标位置

遍历元素,若条件不满足,则将right指针向右移动,直到条件满足为止

条件满足时,则保持右指针不变,开始移动左指针 left

在向窗口中添加新元素或从窗口中删除旧元素时,可能会更新一些与窗口范围有关的数据(例如,本题就需要更新最小子数组的长度)

如何使用滑动窗口解决本题? 

(1)我们定义两个指针left right,并让其都指向数组首元素

(2)此时窗口内只有 2 这一个元素,不满足和 sum >= target,因此将right向右移动,将新的元素加入窗口中,并判断此时子数组的和 sum 是否大于等于target,若满足,则不再移动right

(3)在sum >= target时,首先判断最小的子数组长度是否需要更新,并保持right不变,向右移动左指针left,删除旧的元素,直到sum < target

(4)循环(2)(3),直到right遍历完数组

为什么可以使用滑动窗口解决本题?

因为我们要找的子数组是连续的,且数组中的元素都为正整数,即子数组中增加一个元素,子数组中的元素和sum增加,从窗口中删除一个元素,sum减小,因此我们可以通过改变子数组的两端元素来更新数组,因此可以使用滑动窗口来解决本题

由于左右指针都只遍历了一遍数组,因此时间复杂度O(N)

滑动窗口代码

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int left = 0;
        int right = 0;
        int sum = nums[0];
        int len = nums.length;
        int count = 0;
        while(left <= right && right < len){
            //小于目标值,向右移动右指针right
            while(left <= right && right < len && sum < target){
                right++;
                if(right == len){
                    break;
                }
                sum += nums[right];
            }
            //大于等于目标值
            while(left <= right && sum >= target){
                //更新目标值 由于count的初始值为0,因此需要更新初始值,否则最小值恒为0
                if((right - left) < count || count == 0){
                    count = right - left + 1;
                }
                //左边值出窗口,left向右移动
                sum -= nums[left];
                left++;
            }
        }
        //若count未被更新,则返回0,即没有子数组的和大于target,
        //若count被跟新,则返回最小的子数组长度
        return count;
    }
}

题目来自:

LCR 008. 长度最小的子数组 - 力扣(LeetCode)

总结

到此这篇关于长度最小的子数组题目的文章就介绍到这了,更多相关Java长度最小的子数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 简单了解Java多线程实现的四种方式

    简单了解Java多线程实现的四种方式

    这篇文章主要介绍了简单了解Java多线程实现的四种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java踩坑记录之Arrays.AsList

    Java踩坑记录之Arrays.AsList

    这篇文章主要给大家介绍了关于Java踩坑记录之Arrays.AsList的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 一文带你了解Java中的ForkJoin

    一文带你了解Java中的ForkJoin

    这篇文章主要介绍了一文带你了解Java中的ForkJoin,ForkJoinTask本身的依赖关系并不复杂,它与异步任务计算FutureTask一样均实现了Future接口,下文更多相关资料,需要的小伙伴可以参考一下
    2022-04-04
  • Spring MVC+MyBatis+MySQL实现分页功能实例

    Spring MVC+MyBatis+MySQL实现分页功能实例

    分页功能是我们日常开发中经常会遇到的,下面这篇文章主要给大家介绍了Spring MVC+MyBatis+MySQL实现分页功能的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • 详解Spring Kafka中关于Kafka的配置参数

    详解Spring Kafka中关于Kafka的配置参数

    这篇文章主要介绍了详解Spring Kafka中关于Kafka的配置参数,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • MyBatis trim标签核心用法代码实战

    MyBatis trim标签核心用法代码实战

    MyBatis的<trim>标签用于动态SQL拼接,处理SQL前后缀和多余关键字,避免语法错误,提升代码可维护性,本文给大家介绍MyBatis trim标签核心用法代码实战,感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • Java文件流关闭和垃圾回收机制

    Java文件流关闭和垃圾回收机制

    本文是关于Java IO文件流和垃圾回收问题,一个小的测试程序搞清楚Java IO的问题,希望能帮助有需要的小伙伴
    2016-07-07
  • IDEA实现通过generator自动生成实体类、dao以及mapper文件

    IDEA实现通过generator自动生成实体类、dao以及mapper文件

    文章主要记录了使用MyBatis Generator自动生成代码过程中遇到的一些问题及解决方案,包括MyBatis Generator的配置,Lombok插件的整合,生成的mapping中的.xml文件出现代码重复的问题解决方法等
    2026-05-05
  • java实现简单超市管理系统

    java实现简单超市管理系统

    这篇文章主要为大家详细介绍了java实现简单超市管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • 在Java中实现Excel文档属性添加的操作指南

    在Java中实现Excel文档属性添加的操作指南

    在日常的Java开发工作中,我们经常需要与Excel文档打交道,无论是生成报表、导入导出数据,还是进行数据分析,Excel都扮演着不可或缺的角色,本文将深入探讨如何在Java中,利用功能强大的Spire.XLS for Java库,轻松实现Excel文档属性的添加、修改和读取
    2025-12-12

最新评论