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

leetcode数组-长度最小的子数组

题目

题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/
给定一个含有 n个正整数的数组和一个正整数 target** 。**
找出该数组中满足其总和大于等于target的长度最小的 子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度**。**如果不存在符合条件的子数组,返回 0

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

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        
    }
};
思路 & 代码
暴力解法
#include <vector>
#include <cstdint>
#include <iostream>
using namespace std;

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int sum = 0;
        int subLength = 0;
        int result = INT32_MAX;// 需要<cstdint>头文件

        for(int i = 0; i < nums.size(); i++){
            sum = 0; // 是子序列的和,设置为0,用于下一个子序列的初始值
            for(int j = i; j < nums.size(); j++) {
                sum += nums[j];
                if (sum >= target){
                    subLength = j - i + 1;
                    result = result > subLength ? subLength : result;
                    break; // 找到符合条件的子序列,就退出当前的 j 的for 循环。
                }
            }
        }

        if(result == INT32_MAX)
            return 0; // 说明没有符合条件的子序列
        else 
            return result;
    }
};
// @lc code=end

int main() {
    Solution obj;
    vector<int> vec = {2,1,1,2,4,3};
    int target = 7;

    int res = obj.minSubArrayLen(target, vec);
    cout << res << endl;
}

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

滑动窗口

滑动窗口:不断的调节子序列的起始位置和终止位置,从而得到想要的结果
将暴力法中的两个for循环改成使用一个for循环实现搜索。

  • 窗口内是什么?
    • 满足其和 >= s 的长度最小的 连续 子数组
  • 如何移动窗口的起始位置?
    • 当前窗口的值 >= s,就要往前移动了
  • 如何移动窗口的结束位置?
    • 窗口的结束位置就是遍历数组的指针,也就是for循环里的索引
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int sum = 0;
        int subLength = 0;
        int result = INT32_MAX;// 需要<cstdint>头文件

        int i = 0;
        for(int j = 0; j < nums.size(); j++) {
            sum += nums[j];
            while (sum >= target){
                subLength = j - i + 1;
                result = result > subLength ? subLength : result;
                sum -= nums[i];
                i++;
            }
        }
        
        if(result == INT32_MAX)
            return 0; // 说明没有符合条件的子序列
        else 
            return result;
    }
};

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

http://www.dtcms.com/a/112114.html

相关文章:

  • 【Git】“warning: LF will be replaced by CRLF”的解决办法
  • 【MySQL】DML:添加-修改-删除数据 (数据操作语言) 学习笔记
  • 投影向量的计算公式推导
  • RTOS任务句柄的作用
  • Unity的插件TouchScripts插件的新手入门指南和常用的API使用方法
  • Tradingview 策略分享 - SSL 混合和 CE 交易策略
  • Android Fresco 框架动态图支持模块源码深度剖析(七)
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(3)
  • LabVIEW中VISA Write 与 GPIB Write的差异
  • 【Linux】冯·诺依曼体系结构
  • kotlin中主构造函数是什么
  • Java EE期末总结(第一章)
  • 【图像处理基石】什么是neural style transfer?
  • python基础-09-读写文件
  • tp5 shell_exec() has been disabled for security reasons生成图片报错没权限
  • Android面试总结之算法思想篇
  • Mysql 中的 B+树 和 B 树在进行数据增删改查后的结构调整过程是怎样的?
  • MaxEnt模型全解析:从原理到 R 语言实战,开启生态环境研究新视野
  • 验证码实现
  • d202541
  • 量子计算入门:Qiskit实战量子门电路设计
  • 智慧农业大数据平台解决方案
  • 冰球比赛系统的结构设计:UML类图问题解析和绘图
  • 嵌入式Linux开发环境搭建,三种方式:虚拟机、物理机、WSL
  • 【黑马点评】商户查询缓存
  • 机器学习中的自监督学习概述与实现过程
  • 每日文献(八)——Part four
  • 基于YOLOv8的热力图生成与可视化-支持自定义模型与置信度阈值的多维度分析
  • FPGA系统开发板调试过程不同芯片的移植步骤介绍
  • Leetcode 680 -- 双指针 | 贪心