LeetCode209.长度最小的子数组(滑动窗口法、暴力法)

LeetCode209.长度最小的子数组

  • 1.问题描述
  • 2.解题思路
  • 3.代码
  • 4.知识点

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.解题思路

  1. 暴力解法:一个for循环滑动窗口的起始位置,一个for循环为滑动窗口的终止位置,用两个for循环 完成了一个不断搜索区间的过程。时间复杂度很明显是O(n^2)。目前使用暴力法已经在LeetCode不能通过了,用时过长。
  2. 滑动窗口(双指针):不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果
    1. 由于暴力法用时长,于是要找出能在一个for循环里完成的方法。
    2. 那么一个for循环,需要考虑从起始位置还是终止位置开始。如果只用一个for循环表示滑动窗口的起始位置,那么又会陷入暴力解法的思路。那么,想到,在只用一个for循环的基础上,循环的索引表示滑动窗口的终止位置,通过调节起始位置来改变窗口大小。
    3. 搞定终止位置的滑动,考虑起始位置如何滑动。
      在这里插入图片描述
      总体思路如上述,结果也就是滑动窗口的确定,这是关键
      1. 窗口就是 满足其和 ≥ target 的长度最小的 连续 子数组。

      2. 窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。

      3. 窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。

        滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)暴力解法降为O(n)。

        • 时间复杂度:O(n)每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)。
        • 空间复杂度:O(1)

3.代码

python:滑动窗口

from typing import List


class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        # 初始化最小长度为数组长度加一
        # 或者为 min_len = float('inf')  将变量min_len初始化为正无穷大。
        min_len = len(nums) + 1
        left, right = 0, 0
        # 遍历过的总和,该值要与target进行比较
        cur_sum = 0
        # 双指针遍历数组
        while right < len(nums):
            # 将当前元素加入子数组总和
            cur_sum += nums[right]
            # 当当前子数组和大于等于目标值时,更新最小长度
            while cur_sum >= target:
                # 更新最小长度
                min_len = min(min_len, right - left + 1)
                cur_sum -= nums[left]  # 将左指针对应的值从当前和中减去
                left += 1  # 左指针右移一位
            right += 1  # 右指针右移一位
            # 如果最小长度未被修改,说明没有符合条件的子数组,返回0,否则返回最小长度
        return 0 if min_len == len(nums) + 1 else min_len


target = 7
nums = [2, 3, 1, 2, 4, 3]
# 创建Solution类的实例
solution = Solution()
result = solution.minSubArrayLen(target, nums)
print(result)

python:暴力法

from typing import List


class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        # 获取数组长度
        l = len(nums)
        # 初始化最小长度为数组长度加一
        min_len = len(nums) + 1
        for i in range(l):
            cur_sum = 0
            for j in range(i, l):
                cur_sum += nums[j]
                if cur_sum >= target:
                    min_len = min(min_len, j - i + 1)
                    break
        # 如果最小长度未被修改,说明没有符合条件的子数组,返回0,否则返回最小长度
        return 0 if min_len == len(nums) + 1 else min_len


target = 7
nums = [2, 3, 1, 2, 4, 3]
# 创建Solution类的实例
solution = Solution()
result = solution.minSubArrayLen(target, nums)
print(result)

C++:滑动窗口

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class Solution {
	public:
		int minSubArrayLen(int target, vector<int>& nums) {
			int min_len = nums.size() + 1;  // 初始化最小长度为数组长度加一
			int sum = 0;  // 初始化和为0
			int left = 0;  // 定义左边界
			for (int right = 0; right < nums.size(); right++) {  // 遍历数组
				sum += nums[right];  // 累加当前元素到和中
				while (sum >= target) {  // 若和大于等于目标值
					min_len = min(min_len, right - left + 1);  // 更新最小长度
					sum -= nums[left];  // 移动左边界并更新和
					left++;  // 左边界右移
				}
			}
			return min_len == nums.size() + 1 ? 0 : min_len;  // 若最小长度未被修改,返回0,否则返回最小长度
		}
};

int main() {
	Solution sol;
	vector<int> nums = {2, 3, 1, 2, 4, 3};
	int target = 7;
	int result = sol.minSubArrayLen(target, nums);  // 调用minSubArrayLen方法
	cout << "最小子数组长度为:" << result << endl;  // 输出结果
	return 0;
}

C++:暴力

#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int l = nums.size();  // 获取数组长度
        int min_len = l + 1;  // 初始化最小长度为数组长度加一
        for (int i = 0; i < l; i++) {
            int cur_sum = 0;  //  遍历过的总和,该值要与target进行比较
            for (int j = i; j < l; j++) {
                cur_sum += nums[j];  // 累加当前元素到和中
                if (cur_sum >= target) {  // 若和大于等于目标值
                    min_len = min(min_len, j - i + 1);  // 更新最小长度
                    break;  // 跳出内层循环
                }
            }
        }
        return min_len == l + 1 ? 0 : min_len;  // 若最小长度未被修改,返回0,否则返回最小长度
    }
};

int main() {
    int target = 7;
    vector<int> nums = {2, 3, 1, 2, 4, 3};
    Solution solution;
    int result = solution.minSubArrayLen(target, nums);  // 调用minSubArrayLen方法
    cout << result << endl;  // 输出结果
    return 0;
}

4.知识点

min_len = float('inf')是将min_len的初始值设为正无穷大。在这种情况下,min_len的值可以被修改为任何小于正无穷大的整数值。(infinity的缩写)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里云优惠券如何领取(阿里云在哪领取优惠券)

阿里云优惠券是阿里云为了回馈广大用户而推出的一种优惠活动&#xff0c;可以帮助用户在购买阿里云产品和服务时享受一定的优惠&#xff0c;本文将为大家介绍如何领取阿里云优惠券。 1、通过阿里云官网活动页面领取 阿里云会不定期举办一些优惠活动&#xff0c;例如双十一、双…

C语言基本算法之选择排序

目录 概要&#xff1a; 代码如下 运行结果如下 概要&#xff1a; 它和冒泡排序一样&#xff0c;都是把数组元素按顺序排列&#xff0c;但是方法不同&#xff0c;冒泡排序是把较小值一个一个往后面移&#xff0c;选择排序则是直接找出最小值&#xff0c;可以这个说&#xff…

IDEA如何将本地项目推送到GitHub上?

大家好&#xff0c;我是G探险者。 IntelliJ IDEA 是一个强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它支持多种编程语言和工具。它也内置了对Git和GitHub的支持&#xff0c;让开发者可以轻松地将本地项目推送到GitHub上。以下是一个操作手册&#xff0c;描述了…

身为程序员哪一个瞬间让你最奔溃 ?

身为程序员&#xff0c;有时候最让我感到沮丧的瞬间之一是遇到难以追踪和解决的 Bug。这些 Bug 可能出现在我写的代码中&#xff0c;也可能是由于不可预测的外部因素引起的。其中一个让我最奔溃的瞬间是在一个大型项目中&#xff0c;我遇到了一个非常复杂的Bug&#xff0c;这个…

Apahce虚拟主机配置演示

在企业的真实环境中&#xff0c;一台WEB服务器发布单个网站会非常浪费资源&#xff0c;所以一台WEB服务器一般都会发布多个网站&#xff0c;少则3-5个&#xff0c;多个10-20个网站。在一台服务器上发布多网站&#xff0c;也称之为部署多个虚拟主机。 WEB虚拟机主机配置方法主要…

使用wxPython和PyMuPDF合并PDF文档并自动复制到剪贴板

导语&#xff1a;处理大量的PDF文档可能会变得复杂和耗时。但是&#xff0c;使用Python编程和一些强大的库&#xff0c;如wxPython和PyMuPDF&#xff0c;可以使这个任务变得简单而高效。本文将详细解释一个示例代码&#xff0c;展示如何使用这些库来创建一个可以选择文件夹中的…

GDB Debugging Notes

1 Debugging programs using gdb 1.1 gdb简介 gdb是一个功能强大的调试工具&#xff0c;可以用来调试C程序或C程序。在使用这个工具进行程序调试时&#xff0c;主要涉及下面几个方面的操作&#xff1a; 启动程序:在启动程序时&#xff0c;可以设置程序运行环境。设置断点:程序…

数据仓库架构之详解Kappa和Lambda

目录 一、前言 二、架构详解 1 Lambda 架构 1.1 Lambda 架构组成 1.2 Lambda 特点 1.3 Lambda 架构的优点 1.4 Lambda 架构的不足 2 Kappa 架构 2.1 Kappa 架构的核心组件 2.2 Kappa 架构优点 2.3 Kappa 架构的注意事项 三、区别对比 四、选择时考虑因素 一、前言 …

Java Finalization‘s Memory-Retention Issues 及Reference类解析

引言 《Effective Java Programming Language Guide》 一书中强烈建议不要使用java的finalize()方法去做对象消亡前的清理。因为jvm调用finalize()方法的时机并不确定&#xff0c;容易导致Memory-Retention Issues。通俗点讲就是内存没办法及时回收。 详细的见oracle的官方说明…

[超详细]基于YOLO&OpenCV的人流量统计监测系统(源码&部署教程)

1.图片识别 2.视频识别 [YOLOv7]基于YOLO&#xff06;Deepsort的人流量统计系统(源码&#xff06;部署教程)_哔哩哔哩_bilibili 3.Deepsort目标追踪 &#xff08;1&#xff09;获取原始视频帧 &#xff08;2&#xff09;利用目标检测器对视频帧中的目标进行检测 &#xff08…

京东数据分析(京东数据采集):2023年10月京东平板电视行业品牌销售排行榜

鲸参谋监测的京东平台10月份平板电视市场销售数据已出炉&#xff01; 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;10月份&#xff0c;京东平台上平板电视的销量将近77万&#xff0c;环比增长约23%&#xff0c;同比则下降约30%&#xff1b;销售额为21亿&#xff0c;环…

汽车智能座舱/智能驾驶SOC -1

看到华为&小康的 AITO问界M6、M7各种广告营销、宣传、测评、好评如潮水般席卷网络各APP平台。翻看了中信和海通对特斯拉M3和比亚迪元的拆解报告&#xff0c;也好奇华为的汽车芯片平台又能做出哪些新花样&#xff0c;下面是Mark开头&#xff0c;也学习下智能座舱和智能驾驶芯…

Vue项目 配置项设置

一、项目运行时浏览器自动打开 找到package.json文件 找到"sctipts"配置项 在"serve"配置项最后加上--open "scripts": {"serve": "vue-cli-service serve --open","build": "vue-cli-service build&quo…

2023 最新 PDF.js 在 Vue3 中的使用(长期更新)

因为自己写业务要定制各种 pdf 预览情况&#xff08;可能&#xff09;&#xff0c;所以采用了 pdf.js 而不是各种第三方封装库&#xff0c;主要还是为了更好的自由度。 一、PDF.js 介绍 官方地址 中文文档 PDF.js 是一个使用 HTML5 构建的便携式文档格式查看器。 pdf.js 是社区…

SPASS-指数平滑法

基本概念及统计原理 基本概念 指数平滑法的思想来源于对移动平均预测法的改进。指数平滑法的思想是以无穷大为宽度&#xff0c;各历史值的权重随时间的推移呈指数衰减&#xff0c;这样就解决了移动平均的两个难题。 统计原理 简单模型 Holt线性趋势模型 案例 为了研究上海市…

HarmonyOS ArkTSTabs组件的使用(六)

Tabs组件的使用 ArkUI开发框架提供了一种页签容器组件Tabs&#xff0c;开发者通过Tabs组件可以很容易的实现内容视图的切换。页签容器Tabs的形式多种多样&#xff0c;不同的页面设计页签不一样&#xff0c;可以把页签设置在底部、顶部或者侧边。 Tabs组件的简单使用 Tabs组件…

flutter iOS 视频mov格式转MP4格式

flutter iOS 视频mov格式转MP4格式 前言一、使用video_compress压缩视频总结 前言 今天在写项目的时候&#xff0c;突然发现iOS 里面的有些视频格式是mov的格式&#xff0c;这就导致在视频播放组件无法播放的问题&#xff0c;期间试过替换视频格式&#xff0c;但是又不想存储文…

1-verilog的串行滤波器FIR实现

verilog的串行滤波器FIR实现 1&#xff0c;RTL代码2&#xff0c;RTL原理框图3&#xff0c;测试代码4&#xff0c;输出FIR滤波器的波形 参考文献: 1&#xff0c;基于FPGA的串行FIR滤波器设计与实现 2&#xff0c;FPGA实现FIR滤波器 1&#xff0c;RTL代码 timescale 1ns / 1ps /…

某60区块链安全之Call函数簇滥用实战一学习记录

区块链安全 文章目录 区块链安全Call函数簇滥用实战一实验目的实验环境实验原理实验内容实验过程 Call函数簇滥用实战一 实验目的 学会使用python3的web3模块 学会以太坊Delegatecall漏洞分析及利用 实验环境 Ubuntu18.04操作机 实验工具 python3 实验原理 call 外部调用…

重生之我是一名程序员 37

哈喽啊大家晚上好&#xff01; 今天呢给大家带来一个烧脑的知识——C语言中的栈溢出问题。那什么是栈溢出呢&#xff1f;栈溢出指的是当程序在执行函数调用时&#xff0c;为了保护函数的局部变量和返回地址&#xff0c;将这些数据存储在栈中。如果函数在函数调用时使用了过多的…