代码随想录二刷day2

news2025/2/24 4:29:59

代码随想录复习


文章目录

  • 代码随想录复习
  • 209.长度最小的子数组(滑动窗口)
    • 76.最小覆盖子串
    • 904.水果成篮
  • 59.螺旋矩阵2
    • 螺旋矩阵1


209.长度最小的子数组(滑动窗口)

209.长度最小的子数组
复习一下滑动窗口,滑窗的复杂度还是O(n)的,等于说拿r 遍历了一下数组

首先,滑动窗口的板子

for r in range(len()):
    (在r滑动过程中,更新一下要维护的变量)
    while l <= r and 滑窗移动的条件:
        首先更新一下要维护的变量
        l += 1 (滑窗左边界右移动)
        

按着板子这道题应该能秒杀因为很简单

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        l, r = 0, 0
        sum = 0
        length = len(nums)+1
        for r in range(len(nums)):
            sum += nums[r]
            while l <= r and sum >= target:
                length = min(length, r-l+1)
                sum -= nums[l]
                l += 1
        return length if length != len(nums)+1 else 0

76.最小覆盖子串

76.最小覆盖子串
t字符串中每一位的数量达标,并且总体数量达标,窗口右移
所以需要一个t_wordict和一个总需求flag 参与控制窗口右移
具体的更新窗口变量的逻辑在代码对应部分有所体现

class Solution:
    def minWindow(self, s: str, t: str) -> str:
        l, r = 0, 0
        t_wordict = collections.Counter(t)
        flag = len(t)
        min_len = len(s) + 1
        start, end = 0, -1
        for r in range(len(s)):
            ch = s[r]
            if ch in t_wordict:
                if t_wordict[ch] > 0: flag -= 1
                t_wordict[ch] -= 1
            while l <= r and flag == 0:
                if r-l+1 <= min_len:
                    min_len = r-l+1
                    start, end = l, r
                ch = s[l]
                if ch in t_wordict:
                    if t_wordict[ch] == 0: flag += 1
                    t_wordict[ch] += 1
                l += 1
        return s[start: end+1]

904.水果成篮

904.水果成篮
这道题需要记住的有两个点,

一个是dict可以用Counter,因为新的元素进字典不用创建,直接可以dict[‘ch’] += 1

一个是删除字典里的value值为0的元素可以用 dict.pop(‘ch’)

这道题意思是,窗口里不能出现超过两种元素,求这种窗口的最长长度。所以窗口的更新逻辑是窗口里的元素大于2,但是要注意一旦value为0,要删除它不然会占用元素个数

这道题的结果更新逻辑需要放在窗口右滑之后,因为右滑逻辑是 > 2所以不能在这个时候更新长度,需要在滑动调整之后,迭代较大的那个窗口长度值

class Solution:
    def totalFruit(self, fruits: List[int]) -> int:
        l, r = 0, 0
        fruits_dict = Counter()
        max_length = 0
        for r in range(len(fruits)):
            fruits_dict[fruits[r]] += 1
            while l <= r and len(fruits_dict) > 2:
                fruits_dict[fruits[l]] -= 1
                if fruits_dict[fruits[l]] == 0: fruits_dict.pop(fruits[l])
                l += 1
            max_length = max(max_length, r-l+1)
        return max_length 

59.螺旋矩阵2

59.螺旋矩阵2

还是先理清一下思路,这道题是转着圈去填数去模拟,那么一拿到这个题的第一反应是应该 有两种循环

思维阶梯step1:
第一种属于外层循环,控制转的圈数
通过找规律可以找到如果是22、33的话,转一圈就行,如果是44、55的话,转两圈;可以发现 外层loop = n // 2, while loop 就一圈圈的转,每转一圈 loop-1
如果n是奇数的话,需要最后填上最后一个位置 res[mid][mid], mid = n // 2

思维阶梯step2:
第二种属于内层遍历,什么意思呢,就是每一条边怎么填。
这里就需要用for了,可以看出,每一条边都坚持左闭右开的原则,这个图还不是很形象,如果是5*5的话就不一样了,每一圈loop之后,内层的for循环的开始位置和结束位置都需要移动一位,我们用startx, starty,表示横行和列的循环开始,一开始初始化为0从头开始;结束位置可以看出都需要提前一位,我们可以整一个offset, 一开始初始化为1,结束位置就是n - offset。 每绕一圈,startx, starty, 和 offset都需要+1

思维阶梯step3:
loop也就是绕圈结束后,如果n一开始是奇数,需要手动填最后的中心

有了这三步思维阶梯,就应该能够a出来,注意, startx, starty代表的含义,我习惯y代表列,x代表行, j代表列,i代表行
在这里插入图片描述

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        res = [[0] * n for _ in range(n)]
        loop, mid = n // 2, n // 2
        startx, starty, offset = 0, 0, 1
        cnt = 1
 
        while loop:
            loop -= 1
            for j in range(starty, n-offset):
                res[startx][j] = cnt
                cnt += 1
            for i in range(startx, n-offset):
                res[i][n-offset] = cnt
                cnt += 1
            for j in range(n-offset, starty, -1):
                res[n-offset][j] = cnt
                cnt += 1
            for i in range(n-offset, startx, -1):
                res[i][starty] = cnt
                cnt += 1
 
            startx += 1
            starty += 1
            offset += 1

        if n % 2 == 1: res[mid][mid] = cnt
        return res

螺旋矩阵1

54.螺旋矩阵
不想看答案了,直接仿照螺旋矩阵2写的;这道题相比上一道,多了一些不是方阵的情况,方阵的话很容易读出来,有奇数的行列的话我加了一些特判

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        m, n = len(matrix), len(matrix[0])
        loop = min(m//2, n//2)
        startx, starty, offset = 0, 0, 1
        res = []

        if m == 1: #只有一行的情况
            for j in range(len(matrix[0])):
                res.append(matrix[0][j])
            return res
        if n == 1: #有多行只有一列的情况
            for i in range(len(matrix)):
                res.append(matrix[i][0])
            return res

        while loop:
            loop -= 1
            for j in range(starty, n-offset):
                res.append(matrix[startx][j])
            for i in range(startx, m-offset):
                res.append(matrix[i][n-offset])
            for j in range(n-offset, starty, -1):
                res.append(matrix[m-offset][j])
            for i in range(m-offset, startx, -1):
                res.append(matrix[i][starty])
            
            startx += 1
            starty += 1
            offset += 1
        #绕圈完之后的特判
        if m == n and m % 2 == 1:   #3*3 or 5*5这种情况
            res.append(matrix[m//2][n//2])
        if m != n and (m%2==1 and n%2==0  or n%2==1 and m%2==0): #3*4 or 4*3的情况
            if m % 2 == 1:
                for j in range(starty, n-offset+1):
                    res.append(matrix[m//2][j])
            elif n % 2 == 1:
                for i in range(startx, m-offset+1):
                    res.append(matrix[i][n//2])
        if m != n and (m % 2 == 1 and n % 2 == 1):    #3*5 or 5*3的情况
            if m > n:
                for i in range(startx, m-offset+1):
                    res.append(matrix[i][n//2])
            else:
                for j in range(starty, n-offset+1):
                    res.append(matrix[m//2][j])
        return res

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/115990.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL时间查询讲解+实战教学(查询本月、上个月、下个月等等的数据)

MySql时间查询 MySql查询当前时间 查询 年-月-日 时:分:秒 select now() 查询 年-月-日 select DATE(CURDATE()) 查询 年-月 select date_format(NOW(),%Y-%m) 查询当前年 select YEAR(CURDATE()) 查询当前月 select MONTH(CURDATE()) 查询当前日 select DAYOFMONTH(NOW()) 查…

【论文简述】Efficient Multi-view Stereo by Iterative Dynamic Cost Volume(CVPR 2022)

一、论文简述 1. 第一作者&#xff1a;Shaoqian Wang、Bo Li 2. 发表年份&#xff1a;2022 3. 发表期刊&#xff1a;CVPR 4. 关键词&#xff1a;MVS、深度学习、动态代价体、GRU、迭代优化 5. 探索动机&#xff1a;由于正则化步骤需要较多的GPU内存和处理时间&#xff0c…

大话JMeter4|不同的并发数可以自动化做压测吗?

1080709 23.5 KB 上节课爱画漫画的小哥哥用漫画形式向大家展示了JMeter的进阶用法&#xff1a;如何搭建InfluxDB&#xff0c;使用更炫酷的Grafana。 看到很多小伙伴觉得看的不过瘾&#xff0c;在强烈的催促下&#xff0c;小哥哥的新文章又出来了。这次小哥哥又给我们带来怎样的…

vue + nodejs + npm

node.js下载 1、如图所示&#xff1a; 2、建立node_cache、node_global文件夹&#xff1a; 然后运行以下2条命令 npm config set prefix “D:\node-v14.15.0-win-x64\node_global” npm config set cache “D:\node-v14.15.0-win-x64\node_cache” 执行npm list -global查看&…

编译原理——求短语、直接短语(简单短语)、素短语、句柄

先介绍一下短语、直接短语&#xff08;简单短语&#xff09;、素短语、句柄怎么求&#xff1a;这个图是核心 然后通过一些例题&#xff0c;实战一下&#xff1b; 根据上面介绍的概念、求法&#xff0c;应用一下即可&#xff1b; 例题1 短语&#xff1a;注意对于每一个子树&a…

数字孪生技术助力高炉数字化建设的可行性

随着数字孪生等新一代信息技术的快速发展&#xff0c;数字化转型已成为企业重塑竞争优势的关键举措。依托数字孪生技术&#xff0c;对炼铁高炉进行物联网、数字化信息系统建设&#xff0c;实现了高炉运行状态的数字化监测与预警&#xff0c;数字孪生系统凭借在数字化、模型化、…

利用WordPress搭建属于自己的网站

怎么用WordPress给自己搭建了一个网站&#xff1f;可能很多人都想拥有属于自己的网站&#xff0c;这篇文章就找你怎么利用WordPress搭建属于自己的网站。如果你也正好有搭建个人网站的想法&#xff0c;那么本文会给你一个参考&#xff0c;我尽量写的比较详细&#xff0c;给自己…

【Ctfer训练计划】——(五)

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座右…

Java on VS Code 11月更新|VS Code Java 开发者超200万!

作者&#xff1a;Nick Zhu - Senior Program Manager, Developer Division at Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;我们很高兴与大家分享一个好消息&#xff0c;现在 Visual Studio Code 上已有超过 200 万 Java 开发者&#xff0c;这离不开长期以来社区以…

JavaSE笔记——异常、断言

文章目录前言一、处 理 错 误1.异常分类2.声明受查异常3.如何抛出异常4.创建异常类二、捕获异常1.捕获异常2.捕获多个异常3.再次抛出异常与异常链4.finally 子句5.带资源的 try 语句三、使用断言1.断言的概念2.启用和禁用断言3.使用断言完成参数检查总结前言 在现实世界中却充…

由浅入深学安全-1

由浅入深学安全 常用术语解析 肉鸡 肉鸡也称傀儡机&#xff0c;是指可以被黑客远程控制的机器。 比如用灰鸽子等诱导客户点击或者电脑被黑客攻破或用户电脑有漏洞被种植了木马&#xff0c;黑客可以随意操纵它并利用它做任何事情。 一句话木马 一句话木马主要用来配合菜刀…

【Java系列】还在为Java运算符而烦恼吗?一篇文章带你解答心中烦恼

返回主篇章         &#x1f447; 【Java】才疏学浅小石Java问道之路 Java基本运算符1. 算数运算符分类运算法则2. 关系运算符分类注意项3. 逻辑运算符分类运算法则4. 短路逻辑运算符分类运算法则5. 赋值运算符拓展6. 三元运算符格式运算法则7. 自增自减运算符分类使用…

12-Golang中的嵌套分支以及switch语句的用法

Golang中的嵌套分支以及switch语句的用法嵌套分支基本介绍基本语法switch基本介绍基本语法流程图使用细节嵌套分支 基本介绍 在一个分支结构中又完整的嵌套了另一个完整的分支结构&#xff0c;里面的分支的结构称为内层分支外面的分支结构称为外层分支 基本语法 if 条件表达…

声明式服务调用OpenFeign

文章目录一. OpenFeign1. Feign 与 OpenFeign二. OpenFeign的使用三. OpenFeign自定义配置1. 修改日志级别2. 超时控制四. OpenFeign性能优化五. OpenFeign最佳实践1. 继承2. 抽取PS: 本文为作者学习笔记&#xff0c;实际技术参加意义不大&#xff0c;本文将持续改进完善。 一…

Doris(二)

目录1、Doris数据的导入和导出1.1 数据导入1.1.1 Broker Load1.1.1.1 适用场景1.1.1.2 基本原理1.1.1.3 基本语法1.1.1.4 导入示例1.1.1.5 查看导入1.1.1.6 取消导入1.1.2 Stream Load1.1.2.1 适用场景1.1.2.2 基本原理1.1.2.3 基本语法1.1.2.4 导入示例1.1.2.5 取消导入1.1.3 …

蓝牙耳机什么牌子好?性价比最高的蓝牙耳机排行榜

近年来&#xff0c;蓝牙耳机品牌与日俱增&#xff0c;可供人们选择的范围也越来越大。当然&#xff0c;主打性价比的蓝牙耳机品牌也有很多&#xff0c;下面&#xff0c;我来给大家分享几款性价比最高的蓝牙耳机&#xff0c;一起来看看吧。 一、南卡小音舱蓝牙耳机 售价&#…

寒潮来袭,这款产品在跨境电商市场卖脱销

年底的寒潮来袭&#xff0c;全球市场热销产品分析跨境电商在年底冬季属于销售旺季&#xff0c;大多数的跨境电商卖家们都开始尽情努力&#xff0c;争取今年获得大批收入&#xff0c;在这个年底既是旺季也是困难季。2022年底旺季时分&#xff0c;有不少产品在跨境电商市场卖脱销…

jQuery index()

jQuery index() 概述 在jQuery中&#xff0c;我们可以使用index()方法来获取当前jQuery对象集合中“指定元素”的索引值。 语法 $(元素).index()说明 index()方法可以接受一个“jQuery对象”或“DOM对象”作为参数&#xff0c;不过一般情况下&#xff0c;我们很少会使用到…

Idea常用快捷键(MacOS和Win平台)持续更新ing~

小名在刚换MacOS系统时总结的一些Idea快捷键&#xff0c;这里小名把Win的对比快捷键和功能都列出来&#xff0c;方便像小名这样“肌肉记忆”的小伙伴顺利过渡&#xff5e; 当然&#xff0c;这些都是小名平日工作常用的快捷键&#xff0c;不熟悉这些快捷键的Win平台小伙伴也可以…

springboot的核心注解详解

springboot的注解详解 Spring Boot 主要优势之一&#xff0c;就是“开箱即用&#xff0c;远离繁琐的配置”。 Spring Boot 架构没有代码生成&#xff0c;也不需要XML配置&#xff0c;有效避免大量的 Maven 导入和各种版本冲突&#xff0c;为 Spring 开发提供一个更快、更广泛…