【算法与数据结构】209.长度最小的子数组

news2024/11/25 18:27:51

文章目录

  • 题目
  • 一、暴力穷解法
  • 二、滑动窗口法
  • 完整代码

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

题目

在这里插入图片描述

一、暴力穷解法

  思路分析:这道题涉及到数组求和,那么我们很容易想到利用两个for循环来写,第一个循环控制开始索引,第二个循环控制结束索引,当大于目标值时就计算子序列长度,我们通过两个索引计算,然后判断和上一个最短子序列长度相比较,如果更短就更新最短长度。
  程序如下

	// 暴力穷解
	int minSubArrayLen2(int target, vector<int>& nums) {
		int result = INT32_MAX;		// int32 类型最大整数
		int sum = 0;	// 子序列之和
		int SubLen = 0;
		for (int begin = 0; begin < nums.size(); begin++) {
			sum = 0;
			for (int end = begin; end < nums.size(); end++) {
				sum += nums[end];				
				if (sum >= target) {
					SubLen = end - begin + 1;
					// 当前子序列的长度小于result(上一个最短子序列长度)时,更新,否则不变。
					result = SubLen < result ? SubLen : result;	
					break;
				}
			}
		}
		return result == INT32_MAX ? 0 : result;	// 如果没有变化,说明没有满足条件的子序列
	}

复杂度分析

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2),用了两个for循环上,放到LeetCode上超时了。
  • 空间复杂度: O ( 1 ) O(1) O(1)

二、滑动窗口法

  思路分析:我们可以想到子序列求和,类似于加窗然后累加这个操作,因此把这个办法叫做滑动窗口法。那么怎么设计窗口呢?==借助于双指针的思想,我们设置起始和终止指针。终止指针不断累加,当和大于目标值,进入for循环,去掉起始指针所在的值,且起始指针++,从而形成新的窗口,进入下一轮的判断。==最终得到最短子序列长度。
  程序如下

	// 双指针法/滑动窗口法
	int minSubArrayLen(int target, vector<int>& nums) {
		int result = INT32_MAX;		// int32 类型最大整数
		int sum = 0;	// 子序列之和
		int SubLen = 0;
		int begin = 0;
		for (int end = 0; end < nums.size(); end++) {
			sum += nums[end];
			while (sum >= target) {
				SubLen = end - begin + 1;
				result = SubLen < result ? SubLen : result;	// 当前子序列的长度小于result(上一个最短子序列长度)时,更新,否则不变。
				sum -= nums[begin++];
			}
		}
		return result == INT32_MAX ? 0 : result;	// 如果没有变化,说明没有满足条件的子序列
	}

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

完整代码

// 209.LeetCode长度最小的子数组
#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
	// 暴力穷解
	int minSubArrayLen2(int target, vector<int>& nums) {
		int result = INT32_MAX;		// int32 类型最大整数
		int sum = 0;	// 子序列之和
		int SubLen = 0;
		for (int begin = 0; begin < nums.size(); begin++) {
			sum = 0;
			for (int end = begin; end < nums.size(); end++) {
				sum += nums[end];				
				if (sum >= target) {
					SubLen = end - begin + 1;
					result = SubLen < result ? SubLen : result;	// 当前子序列的长度小于result(上一个最短子序列长度)时,更新,否则不变。
					break;
				}
			}
		}
		return result == INT32_MAX ? 0 : result;	// 如果没有变化,说明没有满足条件的子序列
	}

	// 双指针法/滑动窗口法
	int minSubArrayLen(int target, vector<int>& nums) {
		int result = INT32_MAX;		// int32 类型最大整数
		int sum = 0;	// 子序列之和
		int SubLen = 0;
		int begin = 0;
		for (int end = 0; end < nums.size(); end++) {
			sum += nums[end];
			while (sum >= target) {
				SubLen = end - begin + 1;
				result = SubLen < result ? SubLen : result;	// 当前子序列的长度小于result(上一个最短子序列长度)时,更新,否则不变。
				sum -= nums[begin++];
			}
		}
		return result == INT32_MAX ? 0 : result;	// 如果没有变化,说明没有满足条件的子序列
	}
};

void my_print(vector<int> & nums, string str) {
	cout << str << endl;
	for (vector<int>::iterator it = nums.begin(); it < nums.end(); it++) {
		cout << *it << ' ';
	}
	cout << endl;
}

int main()
{
	int target = 7;
	int arr[] = { 2,3,1,2,4,3 };
	//int target = 11;
	//int arr[] = { 1,1,1,1,1,1,1,1 };
	vector<int> nums;
	Solution s1;
	for (int i = 0; i < sizeof(arr) / sizeof(int); i++){
		nums.push_back(arr[i]);
	}
	my_print(nums, "目标数组:");
	int sublength = s1.minSubArrayLen(target, nums);
	cout << "满足条件的最短子数组长度:" << endl <<sublength << endl;
	system("pause");
	return 0;
}

end

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

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

相关文章

【科技素养题】少儿编程 蓝桥杯青少组科技素养题真题及解析第20套

少儿编程 蓝桥杯青少组科技素养题真题及解析第20套 1、“唐纳德特朗普 (Donald Trump) 曾经是美国总统”是一个 (),“特朗普关于新冠肺炎疫情的不实言论”是一个 ()。 A、事实;事实 B、观点;事实 C、观点;观点 D、事实;观点 答案:D 考点分析:主要考查小朋友们对时事的…

ChatGPT的未来发展

文章目录 1.什么是ChatGPT2.ChatGPT的基础技术3.ChatGPT工作原理4.ChatGPT应用场景5.ChatGPT局限性6.ChatGPT的未来发展 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xff…

【严重】vm2 <3.9.18 沙箱逃逸漏洞(存在POC)

漏洞描述 vm2 是一个基于 Node.js 的沙箱环境&#xff0c;可以使用列入白名单的 Node 内置模块运行不受信任的代码&#xff0c;代理对象用于拦截并重定义宿主对象的各种操作。 vm2 3.9.18之前版本中&#xff0c;由于 prepareStackTrace 函数直接由 V8 引擎调用&#xff0c;其…

Linux命令(30)之ps

Linux命令之ps 1.ps介绍 linux命令ps是用来查看系统进程的命令。类似与Windows任务管理器中查看到的进程的功能。 2.ps用法 ps [参数] ps常用参数 参数说明-A显示所有的进程数据-a显示跟当前终端关联的所有进程-u基于用户的格式显示-x显示所有进程&#xff0c;不以终端机来…

chatgpt赋能python:用Python建立600*600画布,打造更好的数据可视化!

用Python建立600*600画布&#xff0c;打造更好的数据可视化&#xff01; 简介 数据可视化是数据分析的重要工具之一&#xff0c;通过可视化工具可以更加直观地展现数据&#xff0c;帮助人们更好地理解数据。而Python语言中的matplotlib库正是其中一款功能强大的数据可视化工具…

如何提升自身 WEB 渗透能力?

前言 web 渗透这个东西学起来如果没有头绪和路线的话&#xff0c;是非常烧脑的。 理清 web 渗透学习思路&#xff0c;把自己的学习方案和需要学习的点全部整理&#xff0c;你会发现突然渗透思路就有点眉目了。 程序员之间流行一个词&#xff0c;叫 35 岁危机&#xff0c;&am…

基于MATLAB的Filter使用,低通、带通和高通滤波器的MATLAB程序分享

基于MATLAB的Filter使用&#xff0c;低通、带通和高通滤波器的MATLAB程序分享 完整程序如下&#xff1a; clear all close all clc %% Parameter Interface Frequence0 60; %单位&#xff1a;Hz Frequence1 130; %单位&#xff1a;Hz F…

002-从零搭建微服务-认证中心(二)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff1a;https://gitee.com/csps/mingyue 文档地址&#xff1a;https://gitee.com/csps/mingyue/wikis 创建新项目 MingYue Idea 创建 maven 项目这…

【算法与数据结构】59、LeetCode螺旋矩阵2

文章目录 题目一、方向向量法完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 题目 一、方向向量法 思路分析&#xff1a;螺旋矩阵在旋转过程中&#xff0c;我们选择的区间是左闭右开区间[ , ]&#xff0c;例如方向为从左往右…

【玩转Linux操作】Ubuntu创建桌面快捷方式

&#x1f38a;专栏【玩转Linux操作】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题&#x1f970; 目录 &#x1f34e;进入applications文件夹 &#x1f34e;选择需要添加到…

chatgpt赋能python:Python开发平台软件的重要性

Python开发平台软件的重要性 随着科技的不断进步和软件开发的发展&#xff0c;Python语言逐渐成为最受欢迎和广泛使用的编程语言之一。作为一门高级编程语言&#xff0c;Python具有简单易懂的语法和强大的功能&#xff0c;能够帮助开发者快速构建复杂的应用程序和网站。Python…

初学者应该怎么学git-下

初学者应该怎么学git-下 Git 文件管理 文件四种状态 ● 版本控制就是对文件的版本控制&#xff0c;在Git 管理中&#xff0c;文件被统一管理&#xff0c;有四个状态 Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git 库, 不参与版本控制. 通过git add 状态变为Stage…

高性能网络应用框架

技术主题 Netty从本质上讲是一个高性能网络应用框架&#xff0c;之所以说是高性能&#xff0c;依赖于Netty的线程模型。 一网络编程性能的瓶颈 BIO 模型里&#xff0c; read() 操作和 write() 操作都会阻塞当前线程的&#xff0c;如果客户端已经和服务端建立了一个连接&…

【基于IMX6ULL驱动开发学习】01.安装交叉编译环境【附下载地址】

第一步&#xff08;下载工具链&#xff09;&#xff1a; 从官网上下载交叉编译工具链 https://snapshots.linaro.org/gnu-toolchain/ 按照以下步骤选择 可以选择最新的&#xff08;我也忘记我用的哪个版本了&#xff0c;都可以用问题不大&#xff09; 第二步&#xff08;…

chatgpt赋能python:Python库函数:提高开发效率的利器

Python库函数&#xff1a;提高开发效率的利器 Python作为一门高级编程语言&#xff0c;被广泛应用于 Web开发、科学计算、机器学习、数据分析等领域。它的可读性强、语法简单、库函数丰富是其广受欢迎的原因之一。本文将带您了解Python库函数的优势并介绍几个常用的库函数。 …

大型语言模(LLM) 之 提示词工程(三)

今天我学习了DeepLearning.AI的 Prompt Engineering 的在线课程&#xff0c;我想和大家一起分享一下该门课程的一些主要内容。以下是我写的关于该课程的前两篇博客&#xff1a; 大型语言模(LLM)之提示词工程(一) 大型语言模(LLM)之提示词工程(二) 今天我们来学习第三部分内容…

【express模块】课程笔记

目标&#xff1a; express.static()快速托管静态资源express路由精简项目结构常见express中间件使用express创建API接口在express中启用cors跨域资源共享 目录 一. 初识Express 1.1 Express简介 1. 什么是express 2. 进一步理解Express 3. Express能做什么 1.2 Express…

聊聊那些奇葩的代码规范 —— 滥用 lombok

因为有些要求感觉实是太过奇葩&#xff0c;收集下来娱乐下大家。 代码规范要求 在所有无参数构造函数&#xff0c;全参数构造函数&#xff0c;Getter 和 Setter 方法必须要使用 Lombok。 所有的 Builder 方法也必须要用 Lombok。 简单来说是就是 Lombok 没有提供的才可以使用…

《统计学习方法》——逻辑斯谛回归与最大熵模型(上)

引言 逻辑斯谛回归(logistic regression)是统计学习中的经典分类方法。最大熵是概率模型学习的一个准则&#xff0c;将其推广到分类问题得到最大熵模型(maximum entropy model)。 由于后面最优化方法中用到了最优化理论中的一些知识&#xff0c;建议先阅读最优化简介。 逻辑…

chatgpt赋能python:Python开发环境的安装方法

Python开发环境的安装方法 Python已经成为了当今最流行的编程语言之一&#xff0c;它易于学习和使用&#xff0c;而且庞大的社区提供了大量的资源和库。那么&#xff0c;如果你是一位Python初学者或新手&#xff0c;本篇文章将为您介绍如何安装Python开发环境。 Python环境的…