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


    题目描述:

    给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。

    示例: 

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

    进阶:

    如果你已经完成了O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。

    要完成的函数:

    int minSubArrayLen(int s, vector<int>& nums) 

    说明:

    1、这道题给定一个正整数s,和一个包含正整数的vector,要求在vector中找到最短长度的连续子数组,这个子数组中所有数的和>=s,返回子数组的长度。

    2、这道题不会很难,我们用滑窗的方法找到和>=s的子数组,接着不断更新最短的长度,最终返回这个最短的长度即可。

    最后要考虑一下边界情况,也就是当滑窗到达vector末尾了怎么处理,和vector中没有元素的情况。

    代码如下:(附详解)

        int minSubArrayLen(int s, vector<int>& nums) 
        {
            if(nums.empty())return 0;//vector中没有元素,找不到满足条件的子数组,返回0
            int start=0,end=0,s1=nums.size(),sum=nums[0],record=INT_MAX;//start表示滑窗的开端,end表示滑窗末端
            while(start<s1)//对开端在vector中的每个位置,都进行考虑
            {
                while(sum<s)//当和小于s时,末端不断向右走,sum也不断地加
                {
                    end++;
                    if(end==s1)//如果超出vector的长度,那么当前滑窗不满足条件的,这个时候也就可以返回record了
                        return record==INT_MAX?0:record;//如果record等于初始值,那么必然没有改变过record,也就是从头到尾都没找到满足条件的滑窗
                    sum+=nums[end];
                }
                record=min(record,end-start+1);//更新record
                sum-=nums[start];//减去开端
                start++;//开端到了下一位
            }
            return record;
            
        }

    上述代码实测8ms,beats 98.44% of cpp submissions。

  • 相关阅读:
    Gson字符串编码,字符串转换成图片保存,二进制转换成图片保存
    时间工具类DateUtil
    RSA 签名、验证、加密、解密帮助类
    富友数据加密解密
    Base64(2)
    MD5(2)
    实体对象操作工具
    HttpClient工具类
    MD5
    身份证算法实现
  • 原文地址:https://www.cnblogs.com/chenjx85/p/9634081.html
Copyright © 2020-2023  润新知