leetcode分类刷题:易混题辨析一、209. 长度最小的子数组 vs 560. 和为K的子数组

这篇具有很好参考价值的文章主要介绍了leetcode分类刷题:易混题辨析一、209. 长度最小的子数组 vs 560. 和为K的子数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、刷题慢慢积累起来以后,遇到相似的题目时,会出现算法思路混淆了
2、这两道题都是对连续子数组加和进行考察,细节区别在于数组元素在209. 长度最小的子数组为正整数(窗口增加元素递增,减少元素递减),在560. 和为K的子数组为整数
3、209. 长度最小的子数组采用滑动窗口的算法,560. 和为K的子数组采用前缀和+哈希表的算法

209. 长度最小的子数组

1、有点像leetcode分类刷题:基于数组的双指针(一、基于元素移除的O(1)类型)中的快慢指针,快指针遍历数组元素,慢指针在满足一定条件时更新。
2、同时,要注意 基本子数组类型 更新窗口左边界时用while循环

from typing import List
'''
209. 长度最小的子数组
题目描述:给定一个含有n个正整数的数组和一个正整数target。
找出该数组中满足其和 ≥target的 长度最小的 连续子数组[numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。
如果不存在符合条件的子数组,返回 0 。
示例 1:
    输入:target = 7, nums = [2,3,1,2,4,3]
    输出:2
    解释:子数组 [4,3] 是该条件下的长度最小的子数组
题眼:≥target的 长度最小的 连续子数组;
注意:因为这道题保证了数组中每个元素都为正,所以窗口增加元素递增,减少元素递减
思路:滑动窗口(双指针的特殊形式),设置窗口左右边界[left, right],初始值均为0,右边界遍历数组,满足条件后,while循环更新左边界,
关键在于思考清楚窗口的左右边界如何更新(和基于数组的双指针的题目同理)
总结:这个题的思路怎么想到双指针呢?首先数组必然要遍历,需要一个指针,另外要去寻找满足条件的子数组,必然再需要另一个(和基于数组的双指针的题目同理)
'''


class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        left, right = 0, 0
        s = 0
        result = len(nums) + 1  # 取一个大于数组长度的值
        for right in range(len(nums)):
            # 1、当移动right扩大窗口,进行哪些操作
            s += nums[right]
            # 2、什么条件下,窗口应该暂停扩大,开始移动left缩小窗口
            while s >= target:
                # 3、缩小窗口进行哪些操作
                # 4、更新结果
                result = min(result, right - left + 1)  # 滑窗[left, right]是左闭右闭区间,子数组长度==元素个数
                s -= nums[left]
                left += 1
            right += 1
        if result != len(nums) + 1:  # 不存在符合条件的子数组:所有元素加起来都小于target
            return result
        return 0


if __name__ == "__main__":
    obj = Solution()
    while True:
        try:
            in_line = input().strip().split('=')
            target = int(in_line[1].split(',')[0].strip())
            nums = [int(n) for n in in_line[2].split(']')[0].split('[')[1].split(',')]
            print(obj.minSubArrayLen(target, nums))
        except EOFError:
            break

560. 和为 K 的子数组

1、通过题眼连续子数组来判断,该题很像是滑动窗口的解法,但数组元素为整数,不是正整数,不满足滑窗右边界增大元素之和递增、左指针增大元素之和递减
2、要用前缀和(按照闭区间形式,当前索引位置的值也算进去好理解)+哈希表的思路!
3、通过这道题也认识到,如果“1. 两数之和”不是限定了样例只存在一个答案,其哈希表更新的逻辑有缺陷文章来源地址https://www.toymoban.com/news/detail-686930.html

from typing import List
'''
560. 和为 K 的子数组
题目描述:给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 。
示例 1:
    输入:nums = [1,1,1], k = 2
    输出:2
题眼:连续子数组,很像是滑动窗口的解法,但数组元素为整数,不是正整数,不满足滑窗右边界增大元素之和递增、左指针增大元素之和递减 了
思路:无法用滑动窗口了;要用前缀和(按照闭区间形式,当前索引位置的值也算进去好理解)+哈希表的思路!
“1. 两数之和”的扩展:通过这道题也认识到,如果“1. 两数之和”不是限定了样例只存在一个答案,其哈希表更新的逻辑有缺陷
'''


class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        result = 0
        hashTable = {0: 1}  # 这里保证了对 包含起始元素的连续子数组 的判断
        prefixSum = 0
        for n in nums:  # 查找 以当前遍历元素n对应的索引位置为 右边界的连续子数组
            prefixSum += n   # 前缀和(按照闭区间形式,当前索引位置的值也算进去好理解)
            # 1、先找 以当前遍历元素n对应的索引位置 之前的前缀和是否存在满足条件的
            if prefixSum - k in hashTable:
                result += hashTable[prefixSum - k]
            # 2、再将当前遍历元素n对应的索引位置 的前缀和添加到hashDict
            if prefixSum not in hashTable:
                hashTable[prefixSum] = 1
            else:
                hashTable[prefixSum] += 1
        return result


if __name__ == "__main__":
    obj = Solution()
    while True:
        try:
            in_line = input().strip().split('=')
            nums = [int(n) for n in in_line[1].split('[')[1].split(']')[0].split(',')]
            k = int(in_line[2].strip())
            print(obj.subarraySum(nums, k))
        except EOFError:
            break

到了这里,关于leetcode分类刷题:易混题辨析一、209. 长度最小的子数组 vs 560. 和为K的子数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • leetcode 70.爬楼梯+209.长度最小的子数组

    70. 爬楼梯 - 力扣(LeetCode) 题目: 假设你正在爬楼梯。需要  n  阶你才能到达楼顶。 每次你可以爬  1  或  2  个台阶。你有多少种不同的方法可以爬到楼顶呢?  示例:   输入: n = 3 输出: 3 解释: 有三种方法可以爬到楼顶。 1. 1 阶 + 1 阶 + 1 阶 2. 1 阶 + 2 阶 3. 2 阶 +

    2024年02月03日
    浏览(49)
  • ( 数组) 209. 长度最小的子数组——【Leetcode每日一题】

    难度:中等 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1: 输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数

    2024年02月06日
    浏览(39)
  • 算法刷题营【Day2】:: 双指针算法应用:滑动窗口 :209. 长度最小的子数组

    本内容是笔者结合《代码随想录》总结所得,记录学习过程,分享知识! 目录: 1. 开篇例题:209. 长度最小的子数组 2. 题解参考 - - 2.1 方法一:暴力法 - - 2.2 方法二:滑动窗口 3. 方法思路点拨:滑动窗口 - - 3.1 直白解释 - - 3.2 本题思路点拨 4. 相关题集 1. 开篇例题:209. 长度

    2024年02月04日
    浏览(46)
  • 【算法|滑动窗口No.1】leetcode209. 长度最小的子数组

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成长,共同进步。

    2024年02月08日
    浏览(40)
  • 【代码随想录-Leetcode第六题:209. 长度最小的子数组】

    给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 参考【代码随想录】 示例 1: 示例 3: 提示: 1 = target = 109 1 = nums.length

    2024年02月12日
    浏览(39)
  • Leetcode 977-有序数组的平方 | LeetCode209-长度最小的子数组 | Leetcode59-螺旋矩阵

    给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 思考: 这个数组为有序数组,那么即使前面有负的,数组平方的最大值只能是在数组的倆端,不是在左边就是右边,不可能是在中间 由此想到双指针做法,left从

    2024年02月16日
    浏览(46)
  • LeetCode977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

    LeetCode977.有序数组的平方 思路:         双指针应用         因为数组是有序的,数组中可能存在负数,所以其平方的最大值只可能是数组的头或尾,因此可以定义两个指针,i指向头,j指向尾。同时定义一个新数组result,让k指向新数组的最后一个元素,当nums[i] * nums[i]

    2023年04月21日
    浏览(43)
  • [自我记录]随想录刷题第二天 | 977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

     代码随想录打卡第二天, 新手自我记录一下刷题历程, 仅为自我打卡使用. 今天刷了三道主题, 第一道双指针和第三道模拟做出来了, 第二道写出了暴力解法但是提交leetcode超时了, 测试用例过了18/20, 看了carl哥答案以后自己重新补写了滑动窗口方法. 977. 有序数组的平方 简单题

    2024年02月05日
    浏览(43)
  • LeetCode-Day2-977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,

    双指针法,原来数组是有序的,说明平房之后最左和最右两边的平方和是最大的,比较最大的插入新的vector数组,然后移动指针选下一个元素进行比较。 接下来就开始介绍数组操作中另一个重要的方法: 滑动窗口 。 所谓滑动窗口, 就是不断的调节子序列的起始位置和终止

    2024年02月16日
    浏览(44)
  • 【LeetCode题目详解】 977.有序数组的平方 209.长度最小的子数组59.螺旋矩阵II day2

    看完这个题目第一想法就是直接暴力解决,直接将全部平方然后进行排序。比如快排。 代码如下: 时间复杂度是 O(nlogn)或者说【O(n + nlogn)】,括号里面这个是为了比较接下来的方法。 然后看了代码随想录的视频学习了用双指针来写这道题的方法(说实话不看视频真没想到可

    2024年02月13日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包