python实现链表的删除_leetcode的python实现(209) 长度最小的子数组

【长度最小的子数组】


题目描述
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。
示例:
输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。
思路 1.双指针
使用两个指针l和r, 指针r先往后扫描,得到前缀和第一次大于目标值s时,指针l 再从头开始扫描,每次l 的起始位置和r 的结束位置构成一个窗口,在这个窗口中找到长度最小的连续子数组的长度.时间复杂度O(n),空间复杂度为O(1)。 2.一次遍历+二分查找
使用前缀和的额外数组sums,若sums[j] - sum[i] =  s,则连续子数组的长度为j-i+1,需要找到最小的j-i+1,其中一次遍历确定索引i,二分查找确定索引j,时间复杂度为O(nlogn),空间复杂度为O(n)。
1.双指针
class Solution:    def minSubArrayLen(self, s: int, nums: List[int]) -> int:        if not nums:            return 0        n = len(nums)        ans = n + 1        l, r = 0, 0        nsum = 0        while r < n:#            nsum += nums[r]            while nsum >= s:                ans = min(ans, r - l + 1)                nsum -= nums[l]                l += 1            r += 1        return ans if ans != n + 1 else 0

2.一次遍历+二分查找

class Solution:    def minSubArrayLen(self, s: int, nums: List[int]) -> int:        if not nums:            return 0                n = len(nums)        ans = n + 1        sums = [0]        for i in range(n):            sums.append(sums[-1] + nums[i])#前缀和序列,升序        print(sums)        for i in range(1, n + 1):            target = s + sums[i - 1]            bound = self.binarySearchIndex(sums, target)            if bound != len(sums):                ans = min(ans, bound - (i - 1))#取最小的长度        return 0 if ans == n + 1 else ans        #二分法,返回查找值或第一个大于它的值的索引    def binarySearchIndex(self, nums, target):        l , r = 0, len(nums)        while l< r:            mid = (l+r)//2            if nums[mid] == target:                return mid            elif nums[mid] < target:                l = mid+1            else:                r = mid        return l

参考解法:

https://leetcode-cn.com/problems/minimum-size-subarray-sum/solution/chang-du-zui-xiao-de-zi-shu-zu-by-leetcode-solutio/

点击左下角【阅读原文】查看leetcode官网本题描述

【往期文章回顾】

链表

1. 剑指offer的python实现(1)-从尾到头打印链表的值

2. 剑指offer的python实现(6)-反转链表

3. 剑指offer的python实现(15)-链表中倒数第k个结点

4. 剑指offer的python实现(16)-合并两个排序的链表

5. 剑指offer的python实现(18)-删除链表中重复的结点

6. 剑指offer的python实现(20)-链表中的环的入口接点

7. 剑指offer的python实现(23)-两个链表的第一个公共结点

8. 剑指offer的python实现(27)-复杂链表的复制

9. 剑指offer的python实现(29)-二叉搜索树与双向链表

10. leetcode-19. 删除链表的倒数第N个节点

11. leetcode的python实现-(206)反转链表和(92)反转链表II

12. leetcode的python实现-(876)链表的中间结点

13. leetcode的python实现-(148)排序链表

14. leetcode的python实现-(328)奇偶链表

15. leetcode的python实现-(61)旋转链表

16. leetcode的python实现-(面试题 02.01) 移除重复节点


二叉树

1. 剑指offer的python实现(3)-重建二叉树

2. 剑指offer的python实现(4)-二叉树层级遍历

3. 剑指offer的python实现(5)-二叉搜索树的后序遍历序列

4. 剑指offer的python实现(21)-二叉树的镜像

5. 剑指offer的python实现(22)-树的子结构

6. 剑指offer的python实现(25)-二叉树中和为某一值的路径

7. 剑指offer的python实现(30)-二叉树的深度

8. 剑指offer的python实现(33)-平衡二叉树

9. 剑指offer的python实现(38)-二叉树的下一个结点

10. 剑指offer的python实现(39)-对称的二叉树

11. 剑指offer的python实现(40)-二叉搜索树的第k个结点

12. leetcode-二叉树的前、中、后序遍历和层序遍历python实现

13. leetcode-N叉树的前、后序遍历和层序遍历python实现

14. leetcode(98)-验证二叉搜索树

15. leetcode(235)python实现- 二叉搜索树的最近公共祖先

16. leetcode的python实现-(449)序列化和反序列化二叉搜索树


数组

1. leetcode(560)python实现-和为k的子数组

2. 剑指offer的python实现(46)-构建乘积数组

3. 剑指offer的python实现(35)-把数组排成最小的数

4. 剑指offer的python实现(32)-连续子数组的最大和

5. 剑指offer的python实现(31)-数组中出现次数超过一半的数字

6. 剑指offer的python实现(17)-调整数组奇偶数顺序

7. 剑指offer的python实现(9)-旋转数组的最小数字

8. 找出一维数组中的重复值-python实现

9. leetcode-1.两数之和

10. leetcode的python实现-(15)三数之和

11. leetcode的python实现-(18)四数之和


字符串

1. 剑指offer的python实现(36)-第一个只出现一次的字符位置

2. 剑指offer的python实现(42)-左旋转字符串

3. 剑指offer的python实现(45)-把字符串转换成整数

4. leetcode的python实现-(面试题46).把数字翻译成字符串

5. leetcode的python实现-(125)验证回文串

6. leetcode的python实现-(680) 验证回文字符串Ⅱ


栈和队列

1. 剑指offer的python实现(7)-用两个栈实现队列

2. 剑指offer的python实现(8)-栈的压入弹出序列

3. 剑指offer的python实现(28)-包含min函数的栈

4. leetcode的python实现-(739)每日温度

5. leetcode的python实现-(496)下一个更大元素 I

6. leetcode的python实现-(503)下一个更大元素 II


动态规划

1. 剑指offer的python实现(10)-斐波那契数列

2. 剑指offer的python实现(11)-跳台阶

3. 剑指offer的python实现(12)-变态跳台阶

4. leetcode的python实现-(62) 不同路径

5. leetcode的python实现-(63) 不同路径 II

6. leetcode的python实现-(64) 最小路径和


排序算法

1. 冒泡排序、选择排序、插入排序、快速排序的python实现
2. 归并排序、堆排序的python实现

3. 计数排序、桶排序、基数排序的python实现


长按二维码关注公众号,获取更多内容

1f244c0f31800be95a5e12fae966eb71.png

点击留言

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值