当前位置: 首页 > news >正文

算法题(Python)数组篇 | 4.长度最小的子数组

算法题(Python)数组篇 | 4.长度最小的子数组

  • 一、题目描述
  • 二、题解
    • 2.1 解法一:暴力解法
    • 2.2 解法二:滑动窗口

一、题目描述

给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于target的长度最小的子数组,并返回其长度。如果不存在符合条件的子数组,返回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 <= 10^9
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^4

二、题解

2.1 解法一:暴力解法

本题的暴力解法是采用两个for循环,然后不断地寻找符合条件的子序列,时间复杂度是O(n2)O(n^2)O(n2),代码如下:

class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:length = len(nums)min_len = float('inf')  # 子序列的长度for i in range(length):  # 设置子序列的起点icurrent_sum = 0for j in range(i, length):  # 设置子序列的终止位置jcurrent_sum += nums[j]if current_sum >= target:  # 如果子序列的和超过了target,更新子序列的长度min_len = min(min_len, j - i + 1)break  # 一旦找到符合条件最短的子序列,则break# 如果min_len没有被赋值的话,返回0,说明没有符合条件的子序列return min_len if min_len != float('inf') else 0

暴力解法在力扣中是无法通过的,会超时。

2.2 解法二:滑动窗口

滑动窗口,就是不断地调节子序列的起始位置和终止位置,从而得出我们想要的结果。在暴力解法中,是一个for循环滑动窗口的起始位置,一个for循环为滑动窗口的终止位置,用两个for循环完成了一个不断搜索区间的过程。那么滑动窗口如何用一个for循环来完成这个操作呢?
首先要思考,如果用一个for循环,那么应该表示滑动窗口的起始位置,还是终止位置。如果只用一个for循环来表示滑动窗口的起始位置,那么如何遍历剩下的终止位置?此时难免再次陷入暴力解法的怪圈。所以只用一个for循环,那么这个循环的索引,一定是表示滑动窗口的终止位置。
示例:target=7, nums=[2, 3, 1, 2, 4, 3]
在这里插入图片描述
在本题中实现滑动窗口,需要确定如下三点:

  • 窗口内是什么?
  • 如何移动窗口的起始位置?
  • 如何移动窗口的结束位置?

窗口就是满足其和大于等于target的长度最小的连续子数组。
窗口的起始位置如何移动:如果当前窗口的值大于等于target了,窗口就要向前移动(也就是该缩小了)。
窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。
解题的关键在于:窗口的起始位置如何移动,如图所示:
在这里插入图片描述
滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置,从而将O(n2)O(n^2)O(n2)暴力解法降为O(n)O(n)O(n)

class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:length = len(nums)left = 0right = 0min_len = float('inf')current_sum = 0   # 当前的累加值while right < length:current_sum += nums[right]while current_sum >= target:  # 当前的累加值大于目标值min_len = min(min_len, right - left + 1)current_sum = nums[left]left += 1right += 1return min_len if min_len != float('inf') else 0
http://www.dtcms.com/a/577971.html

相关文章:

  • 噬菌体展示技术:基因型 - 表型统一的分子筛选与研发利器
  • 江西网站开发公司电话宁夏水利建设工程网站
  • Ngram Overlap Example Selector in langchain
  • 温州网站改版哪家好郑州建设网站推广公司
  • 长沙网站推广 下拉通推广网站调用时间
  • [手写系列]Go手写db — — 第七版(实现Disk存储引擎、Docker化支持)
  • win11系统 Android Studio AVD 模拟器创建【记录】
  • 架构论文《论UP(统一过程)在开发中的设计和应用》
  • 中文域名网站好不好优化公司网站建设整体架构
  • 【LeetCode】102. 二叉树的层序遍历
  • 梅州市做试块网站wordpress mo
  • wps excel中把特定几列除以某一列,然后以百分比显示
  • 如何预览常见格式word、excel、ppt、图片等格式的文档
  • 免费网络短剧网站小学生编程软件
  • linux服务器常用组件巡检脚本
  • MySQL----case的用法
  • 硅云网站建设视频软件开发交易平台
  • 贵阳建站模板搭建wordpress相册滑动
  • 山东外贸建站工作简历
  • Qt/C++编写GB28181服务/前后端分离/定义一套交互协议/视频点播/录像回放和控制/警情通知
  • langchain基础教程(3)---langchain一些高级用法
  • Palantir Foundry本体层次与数据存储
  • 开源版coreshop微信商城显示产品列表显示的修正(2)
  • 昆山建设局图审中心网站温州做网站老师
  • 网站判断手机跳转代码用wordpress搭建娱乐网
  • 追剧喵 v3.2.0 手机影视播放器工具
  • 三角洲行动-java游戏程序
  • 清晰地说明 NVM、NPM 和 NRM 在 Node.js 开发过程中的作用
  • Java IDEA学习之路:第七、八周课程笔记归纳
  • Vue2 首屏加载慢打包优化的详细记录