首页 > 编程语言 >代码随想录算法训练营第二天| 209.长度最小的子数组、59. 螺旋矩阵 II

代码随想录算法训练营第二天| 209.长度最小的子数组、59. 螺旋矩阵 II

时间:2024-11-14 18:47:21浏览次数:3  
标签:count right 59 nums 209 随想录 offset 窗口 left

文档讲解:代码随想录

视频讲解:代码随想录

状态:完成2道题

滑动窗口

滑动窗口:两个指针一前一后组成滑动窗口,并计算滑动窗口中的元素的问题

适用场景:字符串匹配问题、子数组问题、定长问题

滑动窗口模板:

如果一个字符进入窗口,应该增加windows计数器;
如果一个字符将移除窗口的时候,应该减少windows计数器
当 valid 满足need时应该收缩窗口;应该在收缩窗口的时候更新最终结果。
 

在套用模板时,我们只需要思考以下四个问题:
1、当移动right扩大窗口,即加入字符时,应该更新哪些数据?
2、什么条件下,窗口应该暂停扩大,开始移动left缩小窗口?
3、当移动left缩小窗口,即溢出字符时,应该更新哪些数据?
4、我们要的结果应该在扩大窗口时还是缩小窗口时进行更新?

"""
left, right = 0, 0
count = 0
s = "abc"
while right < len(s):
    # c是将移入窗口的字符
    c = s[right]
    # 右移窗口
    right += 1
    # 进行窗口内数据的一系列更新

    # 判断左侧窗口是否要收缩
    while (windows needs shrink):
        # d 是将移除窗口的字符
        d = s[left]
        # 左移窗口
        left += 1
        # 进行窗口内数据的一系列更新

"""

209.长度最小的子数组

滑动窗口思路:根据题意可知,要求我们统计窗口内元素之和total>=target的最小长度。

需要用到的变量:left、right、total(统计窗口内的元素之和)和res(返回最终结果)

def minSubArrayLen(target, nums):
    if nums is None or len(nums) == 0:
        return 0
    left, right = 0, 0
    total = 0
    res = len(nums) + 1  # 这是最终要返回的结果,为了避免出现示例3的情况,定义的长度比数组长度大1即可
    while right < len(nums):
        total += nums[right]  # 把元素加入到窗口中去
        while total >= target:
            res = min(res, right - left + 1)  # 1.对符合要求的长度进行比对,取最小值
            total -= nums[left]  # 2.移除窗口最左侧的元素
            left += 1  # 3.左指针向右移动
        right += 1
    if res == len(nums) + 1:
        return 0
    else:
        return res

59.螺旋矩阵II

把n=3、4、5、6时的螺旋矩阵画一下,方便理解,左上角为坐标原点

数组[i,j]中i表示行,j表示列,所以在数学上沿着x轴递增的话在数组就是j在递增

def generateMatrix(n):
    nums = [[0] * n for _ in range(n)]
    startx, starty = 0, 0  # 起始点
    loop = n // 2  # 圈数
    mid = n // 2 # 矩阵的中心点
    count = 1  # 计数

    for offset in range(1, loop + 1):  # 每循环一层偏移量加1,偏移量从1开始
        for j in range(starty, n - offset):  # 顶部:从左至右,左闭右开
            nums[startx][j] = count

        for i in range(startx, n - offset):  # 右侧:从上至下
            nums[i][n - offset] = count
            count += 1
        for j in range(n - offset, starty, -1):  # 底部:从右至左
            nums[n - offset][j] = count
            count += 1
        for i in range(n - offset, startx, -1):  # 左侧:从下至上
            nums[i][starty] = count
            count += 1
        startx += 1  # 更新起始点
        starty += 1

    if n % 2 != 0:  # n为奇数时,填充中心点
        nums[mid][mid] = count
    return nums

标签:count,right,59,nums,209,随想录,offset,窗口,left
From: https://blog.csdn.net/weixin_40702604/article/details/143770356

相关文章

  • 代码随想录算法训练营第三十天| 452. 用最少数量的箭引爆气球 、435. 无重叠区间 、76
    452.用最少数量的箭引爆气球思路:以前做过最大不相交子序列的题,这次也是往这根据某一端排序的思路想的,排序后如下图,只需要维护一个公共序列的右边界r就可以了,下一次判断时,只需要判断子区间的左边是否小于r。这个题有点坑的是使用Arrays排序,如果使用昨天的方法:Arra......
  • 代码随想录算法训练营 | 200.岛屿的数量
    岛屿的数量题目链接:https://leetcode.cn/problems/number-of-islands/此题目要点:dfs和bfs都可以解决此题,但是使用dfs代码会更加的简洁首先对grid进行遍历,每一个节点都进行检查,判断是否是1(陆地)如果是,则进行dfs深搜,并将所有搜到的岛屿节点全置为0,表示此块岛屿已经被搜过了,防......
  • 代码随想录算法训练营day45| 115.不同的子序列 583. 两个字符串的删除操作 72.
    学习资料:https://programmercarl.com/0115.不同的子序列.html#算法公开课动态规划系列之编辑距离问题学习记录:115.不同的子序列(当遇到相同字母时,可以选择也可以不选;刚开始没看懂;dp[i][j]是对应i-1结尾和j-1结尾,这样的目的是方便第一行和第一列初始化)点击查看代码classSolut......
  • 代码随想录:二分查找
    代码随想录:二分查找二分法标志:数组顺序排列且无重复简单的二分法,写法是左闭右闭的写法,此种情况的left可以等于right,故while里有等号。classSolution{public:intsearch(vector<int>&nums,inttarget){intleft=0;intright=nums.size()-1;......
  • 代码随想录:移除元素
    代码随想录:移除元素题目中的原地指的是不能开创新的数组。简单双指针解决问题,实际上是vector中的erase的实现原理//erase和迭代器的使用方法std::vector<int>vec={1,2,3,4,5};autoit=vec.begin()+2;//指向元素3//这所谓迭代器其实就是封装后的指针啊vec.era......
  • 代码随想录算法训练营第二十五天| leetcode491.递增子序列、leetcode46.全排列、leetc
    1leetcode491.递增子序列题目链接:491.非递减子序列-力扣(LeetCode)文章链接:代码随想录视频链接:回溯算法精讲,树层去重与树枝去重|LeetCode:491.递增子序列_哔哩哔哩_bilibili思路:用之前的方法,结果翻车了,好好看视频学新技能吧1.1视频后的思路真的没想到用set来去重,还是基......
  • 代码随想录算法训练营 | 所有可达路径
    所有可达路径文章链接:https://programmercarl.com/kamacoder/0098.所有可达路径.html#本题代码题目链接:https://kamacoder.com/problempage.php?pid=1170#include<iostream>#include<vector>usingnamespacestd;//全局路径vector<vector<int>>paths;vector<in......
  • ECE 498/598 Associative Recall Problem
    ECE498/598Fall2024,Homeworks3and4Remarks:HW3&4:Youcanreducethecontextlengthto32ifyouarehavingtroublewiththetrainingtime.HW3&4:Duringtestevaluation,notethatpositionalencodingsforunseen/longcontextarenottrai......
  • 代码随想录算法训练营第二十四天| leetcode93.复原IP地址、 leetcode78.子集、leetcod
    1leetcode93.复原IP地址题目链接:93.复原IP地址-力扣(LeetCode)文章链接:代码随想录视频链接:回溯算法如何分割字符串并判断是合法IP?|LeetCode:93.复原IP地址_哔哩哔哩_bilibili思路:就是将这个字符串符合要求的进行一个收集,然后使用列表存储,最后使用join函数将这个列表进行连......
  • 代码随想录——二叉树17-路径总和
    这两道题目对于递归函数的返回值是不同的,这里进行总结,二叉树遍历中递归函数返回值何时有何时没有。这里总结如下三点:如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。(这种情况就是路径总和ii)如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需......