美文网首页北美程序员面试干货
LeetCode 209 [Minimum Size Subar

LeetCode 209 [Minimum Size Subar

作者: Jason_Yuan | 来源:发表于2016-08-04 16:29 被阅读55次

    原题

    给定一个由 n 个整数组成的数组和一个正整数 s ,请找出该数组中满足其和 ≥ s 的最小长度子数组。如果无解,则返回 -1。

    样例
    给定数组 [2,3,1,2,4,3] 和 s = 7, 子数组 [4,3] 是该条件下的最小长度子数组。

    解题思路

    • 窗口类型题目 - 因为题目就是让我们找到一个起点和一个终点,保证长度最小且里面的数字之和不小于s
    • 最自然的解法 - 双层for循环 - O(n2)的时间复杂度
    • 优化,前向型指针(追击型指针)
    • 第一点:因为i = 0, j = 3时 2 + 2 + 1 + 2 = 8 > 7,是一个candidate,之后我们不需要再向下遍历,因为后面都会大于7,但是长度更长,一定不是最优解,可以直接排除
    • 第二点:在第一点的情况之后,要让i = 1然后从j=i开始遍历吗?答案当然是当然不需要,因为i= 0, j = 3时刚好sum > 7,所以i=1, j=2, i=1, j=3肯定都不需要考虑,可以直接让j从刚刚的位置开始下一轮循环

    完整代码

    class Solution(object):
        def minSubArrayLen(self, s, nums):
            """
            :type s: int
            :type nums: List[int]
            :rtype: int
            """
            right, sum = 0, 0
            res = sys.maxint
            for left in range(len(nums)):
                while right < len(nums) and sum < s:
                    sum += nums[right]
                    right += 1
                if sum >= s:
                    res = min(res, right - left)
                sum -= nums[left]    
            if res == sys.maxint:
                return 0
            return res
    

    相关文章

      网友评论

        本文标题:LeetCode 209 [Minimum Size Subar

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