首页 > 其他分享 >小阳同学刷题日记-209. 长度最小的子数组

小阳同学刷题日记-209. 长度最小的子数组

时间:2024-03-26 20:33:01浏览次数:24  
标签:target nums 209 sum int 数组 长度 小阳 刷题

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

        惯例,献上我自己的菜鸡代码:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n = nums.size(); // 获取数组长度
        int sum = 0; // 记录当前子数组的和
        int slow = 0; // 滑动窗口的左边界
        int minLength = nums.size() + 1; // 初始化最小长度为数组长度加一
        int currentLength = 0; // 当前子数组的长度

        // 遍历数组
        for(int fast = 0; fast < n; fast++) {
            sum += nums[fast]; // 将当前元素加入子数组的和

            // 如果当前子数组的和大于等于目标值,则尝试缩小窗口
            while(sum >= target) {
                currentLength = fast - slow + 1; // 计算当前子数组的长度
                minLength = min(minLength, currentLength); // 更新最小长度
                sum -= nums[slow++]; // 缩小窗口,移动左边界
            }
        }

        // 如果最小长度没有被更新过,则说明不存在满足条件的子数组,返回0;否则返回最小长度
        return minLength == (nums.size() + 1) ? 0 : minLength;
    }
};

         ①for循环暴力解法

 

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n = nums.size(); // 获取数组长度
        int minLength = nums.size() + 1; // 初始化最小长度为数组长度加一

        // 外层循环遍历数组,作为子数组的起始位置
        for (int start = 0; start < n; ++start) {
            int sum = 0; // 子数组的和
            // 内层循环遍历以start位置开头的所有可能的子数组
            for (int end = start; end < n; ++end) {
                sum += nums[end]; // 更新子数组的和
                // 如果当前子数组的和大于等于目标值,更新最小长度并结束内层循环
                if (sum >= target) {
                    minLength = min(minLength, end - start + 1);
                    break;
                }
            }
        }

        // 如果最小长度没有被更新过,则说明不存在满足条件的子数组,返回0;否则返回最小长度
        return minLength == (nums.size() + 1) ? 0 : minLength;
    }
};

        ②滑动窗口:

        滑动窗口具体步骤如下:

  1. 初始化左指针 left、右指针 right,初始时均指向数组的第一个元素。
  2. 初始化变量 sum 0,用于记录滑动窗口内元素的和。
  3. 遍历数组,不断将右指针向右移动,并将对应的元素添加到 sum 中,直到 sum 大于等于 target
  4. 在每次移动右指针时,更新滑动窗口的最小长度,即 result = min(result, right - left + 1)
  5. sum 大于等于 target,则移动左指针,直到 sum 不再大于等于 target,同时更新 result
  6. 重复步骤 3、4、5,直到遍历完整个数组。
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n = nums.size();
        int left = 0, right = 0;
        int sum = 0;
        int result = numeric_limits<int>::max(); // 初始化结果为最大值

        while (right < n) {
            sum += nums[right]; // 将当前元素添加到窗口中
            while (sum >= target) { // 当窗口内元素和大于等于 target 时
                result = min(result, right - left + 1); // 更新最小长度
                sum -= nums[left]; // 移动左指针,减小窗口
                left++;
            }
            right++; // 移动右指针,扩大窗口
        }

        return result == numeric_limits<int>::max() ? 0 : result;
    }
};

     谢谢大家,继续努力。

标签:target,nums,209,sum,int,数组,长度,小阳,刷题
From: https://blog.csdn.net/qq_51769299/article/details/137056375

相关文章

  • LeetCode刷题Day11(补卡)
    20.有效的括号题目链接:leetcode20.有效的括号文章讲解:代码随想录视频讲解:哔哩哔哩视频这题考察的是栈的使用,遍历字符串,如果是左括号存入栈中,如果是右括号则对比栈的头部是否为与之匹配的左括号,如果不是则返回false,最后若栈为空则正好匹配返回true,详细代码如下:cl......
  • 蓝桥杯刷题(十四)
    1.小平方代码n=int(input())count=0deff(x)->bool:#判断条件returnTrueifx**2%n<n/2elseFalseforiinrange(1,n):#遍历[1,n-1],符合题意计数加一iff(i):count+=1print(count)2.3的倍数代码a=int(input())b=int(input())......
  • 力扣刷题之21.合并两个有序链表
    仅做学习笔记之用。题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1=[],l2=[]输出:[]示例3:输入:l1=[],l2=[0]输出:[0]......
  • 每日刷题 例题训练 两数相加
    一.题目给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例:输入:nums=[3,2,4],......
  • python刷题
    题目:编写一个程序将分钟转换为秒。定义函数convert_to_seconds(),参数为minutes。在函数内,将分钟转换为秒(1分钟=60秒),并返回结果。实验1: 运行结果:实验2: 运行结果: 理由是什么呢? ......
  • 刷题笔记 3.25
    ABC254C题:给定一个长为n的数列,给定k,可以进行的操作是:交换a[i]和a[i+k],可以进行任意多次,问能否sort成一个非递减数列?我当时的思路:因为我们是知道最后的数列的样子的,然后就思考:“这个数怎么变过来?可以变吗?”然后就发现好像只需要最后的非递减数列的每一个数在原数列中的对应下标......
  • 【每日算法】理论:AIGC模型 刷题:力扣链表操作
    上期文章【每日算法】理论:图像分割相关刷题:设计链表文章目录上期文章一、上期问题二、理论问题1、LAMAInpaint2、IPadapter模型3、Anydoor4、vit(VisionTransformer)架构5、MAE6、CLIP模型三、力扣刷题回顾-链表操作203.移除链表元素206.反转链表24.两两交换链表......
  • 代码随想录 Day3 数组 | LC977 有序数组的平方 & LC209 长度最小的子数组(滑动窗口))
    四、有序数组的平方题目:力扣977:有序数组的平方给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。示例1:输入:nums=[-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为[16,1,0,9,100]排序后,数组变为[......
  • 代码随想录刷题记录4——滑动窗口和螺旋矩阵
    数组:701.二分查找27.移除元素977.有序数组的平方209.长度最小的子数组59.螺旋矩阵思路:209.长度最小的子数组只要知道要用滑动窗口的思路来写就好了!滑动窗口本质上就是双指针核心问题是考虑好窗口什么时候变大什么时候变小59.螺旋矩阵并没有什么新的算法思想,但......
  • 【力扣刷题日记】1076.项目员工II
    前言练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。今日题目:1076.项目员工II表:Project列名类型project_idintemployee_idint(project_id,employee_id)是该表的主键(具有唯一值的列的组合)。employee_id是该表的外键(......