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

文章目录

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

所有的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

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

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

相关文章

移动端浏览器性能优化探索

目录 前言 如何衡量卡顿 FPS 与卡顿的关系 新的衡量指标 浏览器动画渲染 GPU扮演的角色 合理避免回流和重绘 浏览器工作流程 解决方案 在移动端的页面开发过程中&#xff0c;我们经常提及页面性能优化、消除页面卡顿的话题&#xff0c;如何确定优化策略&#xff0c;我…

“老年养生”APP的设计与开发

摘要&#xff1a;我国人口老龄化呈上升趋势&#xff0c;老年人口比重增加。这是我国经济发展的一大挑战&#xff0c;也是老年健康产业的一大机遇。随着我国经济发展&#xff0c;越来越多的人开始关注自己的身体&#xff0c;这导致各种关于健康的网络应用层出不穷。但是经过分析…

【python技能树】python简介

1 Python定义 Python 是一种简单易学并且结合了解释性、编译性、互动性和面向对象的脚本语言。Python提供了高级数据结构&#xff0c;它的语法和动态类型以及解释性使它成为广大开发者的首选编程语言。 Python 是解释型语言&#xff1a; 开发过程中没有了编译这个环节。类似于…

Python中打印彩色信息的方法

在Python中&#xff0c;可以使用print()函数打印出彩色信息。在使用print()打印之前&#xff0c;需要调用os标准库对系统进行设置。 1 os标准库 1.1 简介 os是Operating System的简写&#xff0c;即“操作系统”。os标准库是一个操作系统接口模块&#xff0c;提供了使用操作…

学生成绩管理系统(Java)

目录 ​编辑 需求分析&#xff1a; 登录界面(LoginPanel) 主界面(MainApp) 重写 1.班级重写(cs.practics.bean.BjBean.java) 2.课程重写(cs.practics.bean.CourseBean.java) 3.成绩重写(cs.practics.bean.MarkBean.java) 4.学生重写(cs.practics.bean.StudentBean.java…

Spring Cloud 容错机试 Hystrix 服务降级 RestTemplate:

Ribon的服务降级操作 雪崩效应&#xff1a; 如果短信服务炸了后面的所有服务就会起连锁反应造成全部服务挂掉&#xff0c;这就是雪崩效应&#xff0c;那么其实短信服务又不是我们主要业务&#xff0c;这个时候我们可以采用服务降级&#xff0c;服务降级就是暂时的把短信服务停…

springboot服务端接口公网远程调试 - 实现HTTP服务监听【端口映射】

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

安装CHATGPT保姆级教程(windows版)

ai包链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1tKuG4OfkewlDRU292vx8mw?pwdtw8t 提取码&#xff1a;tw8t 一、安装篇 安装python&#xff0c;使用软件包中的python安装程序安装后检查是否安装成功&#xff0c;cmd窗口运行命令&#xff1a; python –vers…

python自动化爬虫实战

python自动化爬虫实战 偶然的一次机会再次用到爬虫&#xff0c;借此机会记录一下爬虫的学习经历&#xff0c;方便后续复用。 需求&#xff1a;爬取网站数据并存入的csv文件中&#xff0c;总体分为两步 爬取网站数据存到到csv文件中 1、配置爬虫环境 1.1、下载自动化测试驱动 …

【2023最新】Python + Pycharm + Anaconda安装配置一条龙

【2023最新】Python Pycharm Anaconda安装配置一条龙 文章目录 【2023最新】Python Pycharm Anaconda安装配置一条龙1. Python1.1 Python下载1.2 Python安装1.3 测试 2. Pycharm2.1 Pycharm下载2.2 Pycharm安装配置2.3 你好Pycharm 3. Anaconda3.1 Anaconda下载3.2 Anacond…

【网络】TCP通讯(三次握手、四次挥手;滑动窗口;TCP状态转换;端口复用;TCP心跳检测机制)

前言&#xff1a;建议看着图片&#xff0c;根据文字描述走一遍TCP通讯过程&#xff0c;加深理解。 目录 TCP通信时序&#xff1a; 1&#xff09;建立连接&#xff08;三次握手&#xff09;的过程&#xff1a; 2&#xff09;数据传输的过程&#xff1a; 3&#xff09;关闭连…

opencv4 傅里叶变换

傅里叶变换 ① 高频&#xff1a;变化剧烈的灰度分量&#xff0c;例如边界礁石。 ② 低频&#xff1a;变化缓慢的灰度分量&#xff0c;例如一片大海。 ③ 高通滤波器&#xff1a;只保留高频&#xff0c;会使得图像细节增强。高频边界锐化了&#xff0c;增强了&#xff0c;细节…

网瘾少年转行软件测试,月薪20k? 叛逆少年终归成长...

前言&#xff1a; 高中住校期间沉迷游戏&#xff08;DNF&#xff09;,尤其是高三那年,晚上翻墙出去通宵&#xff0c;白天上课睡觉&#xff0c;高考自然是考了个稀碎&#xff0c;高考结束那个暑假刚开始觉得整个人都自由了&#xff0c;爸妈看我没考上大学&#xff0c;知道我心情…

Sql Server 自动备份

Sql Server 自动备份 文章目录 Sql Server 自动备份1. 打开SQL Server&#xff0c;在管理下找到”维护计划”&#xff0c;右键点击”维护计划向导”&#xff0c;如图&#xff1b;2. 再次点击维护计划向导3. 在选择维护任务下勾选”备份数据库”、”清楚维护任务”4.选择需要备份…

北邮22信通:二叉树显示路径的两种方法 递归函数保存现场返回现场的实例

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 获取更多文章 请访问专栏~ 北邮22信通_青山如墨雨如画的博客-CSDN博客 一.讲解 要想实现二叉树的路径显示&#xff0c;我们要按照…

每日一题——三数之和(双指针)

每日一题 三数之和 题目链接 思路 解析函数原型 首先我们来看一下题目给的函数原型&#xff1a; int** threeSum(int* nums, int numsSize, int* returnSize, int**returnColumnSizes)题目要求我们返回一个二维数组&#xff0c;数组的行数代表着存在多少个满足条件的三元组&…

基于SVM的鸢尾花数据集回归分析

目录 1. 作者介绍2. SVM支持向量机算法2.1 鸢尾花数据集2.2 鸢尾花数据集可视化2.2.1 散点图2.2.2 箱型图2.2.3 三维散点图&#xff08;3D&#xff09; 3. SVM算法实现3.1 完整代码3.2 运行结果3.3 问题与分析 1. 作者介绍 张佳伦&#xff0c;男&#xff0c;西安工程大学电子信…

Cuda | Cudnn安装及其配置

文章目录 &#x1f449;引言&#x1f48e;一、Cuda安装1 选择Cuda版本2下载及运行安装程序3 测试 二、Cudnn安装1、进入官网下载对应cuda版本的cudnn2、下载好相应版本并进行解压安装3、解压完成后4、测试 &#x1f449;引言&#x1f48e; 学习的最大理由是想摆脱平庸&#xf…

stable diffusion图片资源分享和模型推荐,好用的模型有哪些呢?

前言 这篇文章主要是分享我的图片和推荐一些好用的模型&#xff0c;模型不在多在于精&#xff0c;基于几个好的大模型适当下载一下LORA模型&#xff0c;就能画出非常好的图片&#xff0c;多话不说 图片分享 简单展示 详情请看&#xff1a;https://space.bilibili.com/109890…

Linux基础篇 Ubuntu 22.04的环境安装-02

目录 一、资料的获取 二、安装虚拟机 三、安装Ubuntu过程 四、注意事项 一、资料的获取 1.通过官方网站下载 Ubuntu系统下载 | Ubuntuhttps://cn.ubuntu.com/download2.下载桌面板即可 3.选择下载的版本 二、安装虚拟机 1.创建新的虚拟机 2.选择自定义安装 3.硬件兼容性选…