【LeetCode面试150】——209长度最小的子数组

news2024/12/25 13:53:58

博客昵称:沈小农学编程

作者简介:一名在读硕士,定期更新相关算法面试题,欢迎关注小弟!

PS:哈喽!各位CSDN的uu们,我是你的小弟沈小农,希望我的文章能帮助到你。欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘

题目难度:中等

默认优化目标:最小化时间复杂度。

Python默认为Python3。

目录

1 题目描述

2 题目解析

3 算法原理及代码实现

3.1 暴力求解

3.2 前缀和+二分查找

3.3 滑动窗口

参考文献


1 题目描述

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

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

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

示例 2:

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

示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

提示:

  • 1 <= target <= 109

  • 1 <= nums.length <= 105

  • 1 <= nums[i] <= 105

进阶:

  • 如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。

2 题目解析

输入是一个正整数数组nums和一个正整数target,输出是最短子数组长度。约束条件是子数组中的所有元素之和等于target

 

3 算法原理及代码实现

3.1 暴力求解

枚举每个下标作为子数组的开始,对于每个开始下标i,需要找到大于或等于i的最小下标j,使得nums[i]到nums[j]的元素大于或等于target,并更新子数组的长度。

时间复杂度O(n^2),空间复杂度O(1)。

C++代码实现

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n=nums.size();
        int sublen=10000;
        if(!n) return 0;
        else{
            for(int i=0;i<n;i++){
                int sum=0;
                for(int j=i;j<n;j++){
                    sum+=nums[j];
                    if(sum>=target){
                        sublen=min(sublen,j-i+1);
                        break;
                    }
                }
            }
        }
        return sublen==10000 ? 0 : sublen;
    }
};

Python代码实现

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        n,sublen=len(nums),10000
        if(not n):
            return 0
        else:
            for i in range(n):
                sum=0
                for j in range(i,n):
                    sum+=nums[j]
                    if(sum>=target):
                        sublen=min(sublen,j-i+1)
                        break
        return 0 if sublen==10000 else sublen

3.2 前缀和+二分查找

如果使用二分查找,可以将时间复杂度优化到O(log n)。为了使用二分查找,我们需要一个数组sums来记录nums的前缀和。因为nums中每个元素都是正的,所以前缀和递增。

 

时间复杂度O(n log n),空间复杂度O(n)。

C++代码实现

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n=nums.size();
        int sublen=1000000;
        if(!n) return 0;
        vector<int> sums(n+1,0);
        for(int i=1;i<n+1;i++)
            sums[i]=sums[i-1]+nums[i-1];
        for(int i=1;i<n+1;i++){
            int target_new=target+sums[i-1];
            auto bound=lower_bound(sums.begin(),sums.end(),target_new);
            if(bound!=sums.end()) 
                sublen=min(sublen,static_cast<int>((bound-sums.begin()-(i-1))));
        }
        return sublen==1000000 ? 0 : sublen;
    }
};

Python代码实现

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        n,sublen=len(nums),1000000
        if(not n): 
            return 0;
        sums=[0]
        for i in range(n):
            sums.append(sums[-1]+nums[i])
        for i in range(1,n+1):
            target_new=target+sums[i-1]
            bound=bisect.bisect_left(sums,target_new)
            if bound!=len(sums):
                sublen=min(sublen,bound-i+1)
        return 0 if sublen==1000000 else sublen 

3.3 滑动窗口

定义两个指针left和right表示滑动窗口的开始和结束位置,sum用于计算子数组中的元素和。

left和right初始都指向下标0。每一轮迭代,sum+=nums[end],如果sum大于等于target,更新sublen,然后sum减去sum[left],left右移。right右移。以此类推。

 

时间复杂度O(n),空间复杂度O(1)。

C++代码实现

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n=nums.size();
        int left=0,right=0;
        int sublen=1000000;
        int sum=0;
        if(!n) return 0;
        while(right<n){
            sum+=nums[right];
            while(sum>=target){
                sublen=min(sublen,right-left+1);
                sum-=nums[left];
                left++;
            }
            right++;
        }
        return sublen==1000000 ? 0 : sublen;
    }
};

Python代码实现

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        n,sublen=len(nums),1000000
        left,right,sum=0,0,0
        if(not n): 
            return 0
        while right<n:
            sum+=nums[right]
            while sum>=target:
                sublen=min(sublen,right-left+1)
                sum-=nums[left]
                left+=1
            right+=1
        return 0 if sublen==1000000 else sublen

参考文献

力扣面试经典150题

力扣官方题解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2046271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

轻松上手MYSQL:精通正则表达式,数据匹配不再难!

&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索MYSQL正则表达式函数之旅✨ &#x1f44b; 大家好&#xff01;文本学习…

【Cesium】Cesium图层请求完成的回调

有一个业务需要用到cesium图层请求完成的回调&#xff0c;翻了好久的文档终于给我找到&#x1f336;️。 是Cesium.ImageryProvider类的一个属性readyPromise 效果如下&#xff1a; Cesium图层请求完成的回调 完整代码如下&#xff1a; <html lang"en"><h…

PCDN业务推荐

神鸟云&蘑菇云最新业务推荐 &#x1f525;短Z业务-- 支持nat0~nat4 省内调度&#xff0c;晚高峰 跑量9成 配置要求: 线路&#xff1a;单条上行30M 硬件&#xff1a;32线程 64内存条 240G系统盘 1G:2T固态盘 单价&#xff1a;移动1900 电联2500 http://oss.download.…

Mysql(四)---增删查改(进阶)

文章目录 前言1.查询操作1.1.全列查询1.2.指定列查询1.3.列名为表达式查询1.4.查询中使用别名1.5.去重查询1.6.排序1.6.2.NULL 1.7.条件查询1.8.分页查询 2.修改3.删除 前言 上一篇博客&#xff0c;我们学习了一些主键的概念&#xff0c;并且分别创造了一些示例表&#xff0c;…

通过相机来获取图片

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择多个图片和视频文件"相关的内容&#xff0c;本章回中将介绍如何通过相机获取图片文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. …

Codeforces Round 966 (Div. 3)(A,B,C,D,E,F)

A. Primary Task 签到 void solve() {string s;cin>>s;bool bltrue;if(s.size()<2)blfalse;else{if(s.substr(0,2)"10"){if(s[2]0)blfalse;else if(s[2]1&&s.size()<3)blfalse; }else blfalse;}if(bl)cout<<"YES\n";else cout…

数据结构第二天

分文件编程实现&#xff1a; main.c #include <stdio.h> #include <stdlib.h> #include "seqlist.h"int main(int argc, char const *argv[]) {seqlist_p p CreateEpSeqlist();InsertIntoSeqlist(p, 0, 10);InsertIntoSeqlist(p, 1, 20);InsertIntoSeql…

打卡第四十五天:不同的子序列、两个字符串的删除操作、编辑距离

一、不同的子序列&#xff08;困难&#xff09; 题目 文章 视频 这道题目如果不是子序列&#xff0c;而是要求连续序列的&#xff0c;那就可以考虑用KMP。相对于72. 编辑距离简单了不少&#xff0c;因为本题相当于只有删除操作&#xff0c;不用考虑替换增加之类的。但相对于…

Mapreduce_Distinct数据去重

MapReduce中数据去重 输入如下的数据&#xff0c;统计其中的地址信息&#xff0c;并对输出的地址信息进行去重 实现方法&#xff1a;Map阶段输出的信息K2为想要去重的内容&#xff0c;利用Reduce阶段的聚合特点&#xff0c;对K2进行聚合&#xff0c;去重。在两阶段中&#xff…

【数据结构篇】~顺序表

顺序表前言 想要学好数据结构的三大基本功&#xff1a;1.结构体2.指针3.动态内存开辟,这三样将是贯彻整个数据结构的工具。&#xff08;可以去这里了解这三大基本功&#xff09; 顺序表也是线性表的一种&#xff0c;那线性表又是什么呢&#xff1f; 线性表&#xff08;linear …

系列:水果甜度个人手持设备检测-无损检测常用技术和方式汇总

系列:水果甜度个人手持设备检测 -- 无损检测常用技术和方式汇总 概述 无损检测以不损坏被检测对象的使用性能为前提&#xff0c;以物理或化学方法为手段&#xff0c;借助相应的设备器材&#xff0c;按照规定的技术要求&#xff0c;对材料、零部件、结构件进行有效的检验和测…

软件测试第1章 软件测试是什么

目录​​​​​​​ 内容说明 一、软件测试与质量概览需要熟悉什么 二、如何理解质量保证 三、软件测试的误区-程序员和测试的关系 四、软件测试是什么&#xff1f; 五、软件测试的目的 六、软件测试与软件质量保证 七、软件测试的必要性 八、软件测试的基本概念分析 …

HarmonyOS Next 系列之列表下拉刷新和触底加载更多数据实现(十一)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

智碳云/高能耗企业 水-电-气-热-油-空压机等能源数据采集系统【源码】

智碳云/高能耗企业 水-电-气-热-油-空压机等能源数据采集系统【源码】 介绍基于SpringCloud的能源管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码-能管系统软件架构

js 深入学习各种继承方法使用场景

前言 问题&#xff1a; JS 如何实现继承呢&#xff1f;主要有几种继承方式及分别适用于哪些场景呢&#xff1f; 我们学习高级语言&#xff0c;就必须学习面向对象&#xff0c;想要成为高手&#xff0c;就必须学习别人不会的&#xff0c;就比如JS中的继承&#xff0c;好多前端人…

ASP.NET在线交流论坛管理系统

ASP.NET在线交流论坛管理系统 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql server数据库 用户功能有个人信息管理 帖了信息管理 意见反馈信息管理 点赞管理 收藏管理 后台管理员可以进行用户管理 …

部署及使用seata

目录 1.下载seata1.7.0.zip 2.上传至云服务器&#xff0c;使用unar工具解压 3.配置application.yml&#xff0c;主要配置如下参数 4.为seata执行mysql脚本 5.配置nacos配置中心 *6.启动seata服务器 问题&#xff1a;“cause:can not register RM,err:can not connect to…

国外项目管理软件最佳实践:选型与应用

国内外主流的10款国外项目管理软件对比&#xff1a;PingCode、Worktile、Asana、Trello、Monday.com、ClickUp、Wrike、ProofHub、Zoho Projects、Hive。 在寻找适合的国外项目管理软件时&#xff0c;你是否感到不知从何选择&#xff1f;市场上琳琅满目的选项往往令人眼花缭乱&…

微软披露Office最新零日漏洞,可能导致数据泄露

近日&#xff0c;微软披露了 Office 中一个未修补的零日漏洞&#xff0c;如果被成功利用&#xff0c;可能导致敏感信息在未经授权的情况下泄露给恶意行为者。 该漏洞被追踪为 CVE-2024-38200&#xff08;CVSS 得分&#xff1a;7.5&#xff09;&#xff0c;被描述为一个欺骗漏洞…

关于xilinx的FFTIP的使用和仿真

工具&#xff1a;vivado2018.3&#xff0c;modelsim10.6d 场景&#xff1a;在进行数据进行频谱分析的时候&#xff0c;使用FPGA来完成FFT的计算可以加快数据的计算速度。 下面使用仿真完成DDS产生的数据的FFT以及IFFT。原始数据使用DDSIP产生&#xff0c;通过IP产生的波形数据…