美文网首页LeeCode题目笔记
2019-08-28 长度最小的子数组

2019-08-28 长度最小的子数组

作者: Antrn | 来源:发表于2019-08-28 11:04 被阅读0次

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

    示例:

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

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

    Python
    class Solution:
        # def minSubArrayLen(self, s: int, nums: List[int]) -> int:
        #     class Solution:
        def minSubArrayLen(self, s, nums):
            """
            :type s: int
            :type nums: List[int]
            :rtype: int
            """
            l = 0
            r = 0
            sum_all = 0
            nums_len = len(nums)
            minLength = nums_len + 1
            while l < nums_len:
                if r < nums_len and sum_all < s:
                    sum_all += nums[r]
                    r += 1
                else:
                    sum_all -= nums[l]
                    l += 1
    
                if sum_all >= s:
                    minLength = min(minLength, r - l)
    
            if minLength == nums_len + 1:
                return 0
    
            return minLength
    
    C++ O(nlgn)
    class Solution {
    public:
        int minSubArrayLen(int s, vector<int>& nums) {
            int minLen = nums.size()+1;
            int len = nums.size();
            int sum = 0;
            int i=0,j=0;
            while(i < len){
                if(j <len && sum < s){
                    sum += nums[j];
                    ++j;
                }else{
                    sum -= nums[i];
                    ++i;
                }
                if(sum >= s){
                    minLen = minLen>j-i?j-i:minLen;
                }
            }
            if(minLen == len + 1){
                return 0;
            }
            return minLen;
        }
    };
    
    Python
    class Solution:
        def _windowEx(self, nums, size, s):
            sum = 0
            for i, _ in enumerate(nums):
                if i >= size:
                    sum -= nums[i - size]
    
                sum += nums[i]
    
                if sum >= s:
                    return True
            return False
    
        def minSubArrayLen(self, s, nums):
            """
            :type s: int
            :type nums: List[int]
            :rtype: int
            """
            l = 1
            r = len(nums)
            result = 0
            while l <= r:
                mid = l + (r - l)//2
                if self._windowEx(nums, mid, s):
                    r = mid - 1
                    result = mid
                else:
                    l = mid + 1
    
            return result
    

    相关文章

      网友评论

        本文标题:2019-08-28 长度最小的子数组

        本文链接:https://www.haomeiwen.com/subject/qzkpectx.html