[LeetCode周赛复盘] 第 353 场周赛20230709

news2025/1/11 12:58:58

[LeetCode周赛复盘] 第 353 场周赛20230709

    • 一、本周周赛总结
    • 6451. 找出最大的可达成数字
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 6899. 达到末尾下标所需的最大跳跃次数
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 6912. 构造最长非递减子数组
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 6919. 使数组中的所有元素都等于零
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 参考链接

一、本周周赛总结

  • 感觉有奖品大家都来了。
  • T1 数学。
  • T2 dp。
  • T3 dp。
  • T4 差分/BIT RUPQ。
    在这里插入图片描述

6451. 找出最大的可达成数字

6451. 找出最大的可达成数字

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 为了使x num在t步内相同,需要相向而行,每步最大缩短距离是2,那么t步距离是2t。

3. 代码实现

class Solution:
    def theMaximumAchievableX(self, num: int, t: int) -> int:
        return num+2*t

6899. 达到末尾下标所需的最大跳跃次数

6899. 达到末尾下标所需的最大跳跃次数

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 每个位置都尝试向后跳即可。
  • 思考,如果n<=1e5咋做?
    • 改成填表法,然后用离散化线段树维护前边的max。
    • 要离散的数据是nums里所有v v-t v+t。
    • 这题由于n小,所以用BIT甚至更快。

3. 代码实现

class Solution:
    def maximumJumps(self, nums: List[int], t: int) -> int:
        n = len(nums)
        f = [-inf]*n 
        f[0] = 0 
        for i in range(n-1):
            for j in range(i+1,n):
                if abs(nums[j]-nums[i]) <= t:
                    f[j] = max(f[j],f[i]+1)
           
        return f[-1] if f[-1] > -inf else -1

nlgn线段树做法


class ZKW:
    # n = 1
    # size = 1
    # log = 2
    # d = [0]
    # op = None
    # e = 10 ** 15
    """自低向上非递归写法线段树,0_indexed
    tmx = ZKW(pre, max, -2 ** 61)
    """
    __slots__ = ('n', 'op', 'e', 'log', 'size', 'd')

    def __init__(self, V, OP, E):
        """
        V: 原数组
        OP: 操作:max,min,sum
        E: 每个元素默认值
        """
        self.n = len(V)
        self.op = OP
        self.e = E
        self.log = (self.n - 1).bit_length()
        self.size = 1 << self.log
        self.d = [E for i in range(2 * self.size)]
        for i in range(self.n):
            self.d[self.size + i] = V[i]
        for i in range(self.size - 1, 0, -1):
            self.update(i)

    def set(self, p, x):
        # assert 0 <= p and p < self.n
        update = self.update
        p += self.size
        self.d[p] = x
        for i in range(1, self.log + 1):
            update(p >> i)

    def get(self, p):
        # assert 0 <= p and p < self.n
        return self.d[p + self.size]

    def query(self, l, r):  # [l,r)左闭右开
        # assert 0 <= l and l <= r and r <= self.n
        sml, smr, op, d = self.e, self.e, self.op, self.d

        l += self.size
        r += self.size

        while l < r:
            if l & 1:
                sml = op(sml, d[l])
                l += 1
            if r & 1:
                smr = op(d[r - 1], smr)
                r -= 1
            l >>= 1
            r >>= 1
        return self.op(sml, smr)

    def all_query(self):
        return self.d[1]

    def max_right(self, l, f):
        """返回l右侧第一个不满足f的位置"""
        # assert 0 <= l and l <= self.n
        # assert f(self.e)
        if l == self.n:
            return self.n
        l += self.size

        sm, op, d, size = self.e, self.op, self.d, self.size
        while True:
            while l % 2 == 0:
                l >>= 1
            if not (f(op(sm, d[l]))):
                while l < size:
                    l = 2 * l
                    if f(op(sm, d[l])):
                        sm = op(sm, d[l])
                        l += 1
                return l - size
            sm = op(sm, d[l])
            l += 1
            if (l & -l) == l:
                break
        return self.n

    def min_left(self, r, f):
        """返回r左侧连续满足f的最远位置的位置"""
        # assert 0 <= r and r < self.n
        # assert f(self.e)
        if r == 0:
            return 0
        r += self.size
        sm, op, d, size = self.e, self.op, self.d, self.size

        while True:
            r -= 1
            while r > 1 and (r % 2):
                r >>= 1
            if not (f(op(d[r], sm))):
                while r < size:
                    r = (2 * r + 1)
                    if f(op(d[r], sm)):
                        sm = op(d[r], sm)
                        r -= 1
                return r + 1 - size
            sm = op(d[r], sm)
            if (r & -r) == r:
                break
        return 0

    def update(self, k):
        self.d[k] = self.op(self.d[2 * k], self.d[2 * k + 1])

    def __str__(self):
        return str([self.get(i) for i in range(self.n)])



class Solution:
    def maximumJumps(self, nums: List[int], t: int) -> int:
        n = len(nums)
        h = set(nums)
        for v in nums:
            h.add(v-t)
            h.add(v+t)
        h = sorted(h)
        size = len(h)
        f = ZKW([-inf]*size,max,-inf)
        f.set(bisect_left(h,nums[0]),0)
        for i in range(1,n):            
            l,r = bisect_left(h,nums[i]-t),bisect_right(h,nums[i]+t)
            i = bisect_left(h,nums[i])           
            ans = max(f.get(i), f.query(l,r)+1)
            f.set(i,ans)
            
           
        return [-1,ans][ans>-inf]

6912. 构造最长非递减子数组

6912. 构造最长非递减子数组

1. 题目描述

在这里插入图片描述

2. 思路分析

  • dp。
  • 定义f[i][0/1]为以i为右端点时,分别使用num1 num2中数字时的最长长度。
  • 那么转移分别讨论前一个数大小即可。
  • 实现时可以省去第一维度。

3. 代码实现

class Solution:
    def maxNonDecreasingLength(self, nums1, nums2):
        n = len(nums1)        
        
        x = y = 1
        ans = 1 
        for i in range(1,n):
            a=b=1
            if nums1[i] >= nums1[i-1]:
                a = x+1
            if nums1[i] >= nums2[i-1]:
                a = max(a,y+1)
            
            if nums2[i] >= nums1[i-1]:
                b = x+1
            if nums2[i] >= nums2[i-1]:
                b = max(b,y+1)
            ans = max(ans,a,b)
            x,y = a,b 
        
        return ans

6919. 使数组中的所有元素都等于零

6919. 使数组中的所有元素都等于零

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 一眼RUPQ,且是顺序的,所以强行写差分wa半天。
  • 早知道直接BIT了。

3. 代码实现

差分

class Solution:
    def checkArray(self, nums: List[int], k: int) -> bool:
        n = len(nums)
        d = [0]*(n+1)
        d[0] = nums[0]
        for i in range(1,n):
            d[i] = nums[i] - nums[i-1]
       
        for i in range(n-k+1):
            # print(i)
            if d[i]<0:
                # print(i,d[i])
                return False
            
            d[i+k] += d[i]
            d[i]-=d[i]
        # print(d)
        if all(v==0 for v in d[:-1])  :
            return True 
        return False            

BIT

class BinIndexTreeRUPQ:
    """树状数组的RUPQ模型,结合差分理解"""
    def __init__(self, size_or_nums):  # 树状数组,下标需要从1开始
        # 如果size 是数字,那就设置size和空数据;如果size是数组,那就是a
        if isinstance(size_or_nums, int):
            self.size = size_or_nums
            self.c = [0 for _ in range(self.size + 5)]
        else:
            self.size = len(size_or_nums)
            self.c = [0 for _ in range(self.size + 5)]
            for i, v in enumerate(size_or_nums):
                self.add_interval(i + 1, i + 1, v)

    def add_point(self, i, v):  # 单点增加,下标从1开始;不支持直接调用,这里增加的是差分数组的单点
        while i <= self.size:
            self.c[i] += v
            i += i&-i

    def sum_prefix(self, i):  # 前缀求和,下标从1开始;不支持直接调用,这里求和的是差分数组的前缀和
        s = 0
        while i >= 1:
            s += self.c[i]
            i &= i-1
        return s

    def add_interval(self, l, r, v):  # 区间加,下标从1开始,把[l,r]闭区间都加v
        self.add_point(l, v)
        self.add_point(r + 1, -v)

    def query_point(self, i):  # 单点询问值,下标从1开始,返回i位置的值
        return self.sum_prefix(i)

    def lowbit(self, x):
        return x & -x
class Solution:
    def checkArray(self, nums: List[int], k: int) -> bool:
        n = len(nums)
        bit = BinIndexTreeRUPQ(nums)
        for i in range(n-k+1):
            p = bit.query_point(i+1)
            if p < 0:
                return False 
            bit.add_interval(i+1,i+k,-p)
        if all(bit.query_point(i)==0 for i in range(1,n+1))  :
            return True 
        return False                  

参考链接

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

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

相关文章

人工智能与Chat GPT

一本书全面掌握ChatGPT&#xff0c;既有向ChatGPT提问的技巧&#xff0c; 也有构建自己的ChatGPT模型的方法&#xff0c;涵盖开发背景、关联技术、使用方法、应用形式、实用案例等 人工智能是我们这个时代最热门的话题&#xff0c;人们既希望它能代替我们做一些工作&#xff0c…

Python使用SQLAlchemy

Python使用SQLAlchemy 1 安装SQLAlchemy 备注&#xff1a;本文适用于SQLAlchemy>2.0 # 安装SQLAlchemy pip install SQLAlchemy# 安装pymysql pip install pymysql参考文档&#xff08;SQLAlchemy>2.0&#xff09; https://docs.sqlalchemy.org/en/20/创建数据库 # …

什么是敏捷测试?

目录 前言&#xff1a; 敏捷测试的定义 敏捷测试的特点 为什么要敏捷测试 缩短价值交付周期 强调质量属于大家 化繁为简节省成本 敏捷测试VS. 传统测试 传统测试如何迁移到敏捷测试 1. 组织文化的转变 2. 组织架构的调整 3. 人员培训与指导 4. 轻流程 敏捷测试成…

电视访问Samba

文章目录 问题描述方案一&#xff1a;当贝播放器方案二&#xff1a;nPlayer方案三&#xff1a;Kodi 问题描述 本人使用小米 AX9000 路由器 移动硬盘组了个轻 NAS&#xff0c;想通过电视访问 Samba 看视频&#xff08;也可以电脑开 SMB&#xff09; 开启 Samba 功能 文件夹开…

SpringMVC第一讲:SpringMVC基础知识

一、MVC设计模式 MVC的全名是Model View Controller&#xff0c;是模型(Model)&#xff0d;视图(view)&#xff0d;控制器(controller)的缩写&#xff0c;是一种设计模式。它是用一种业务逻辑、数据与界面显示分离的方法来组织代码&#xff0c;将众多的业务逻辑聚集到一个部件…

SIFT(尺度不变特征变换)

Sift&#xff08;尺度不变特征变换&#xff09;&#xff0c;全称是Scale Invariant Feature Transform Sift提取图像的局部特征&#xff0c;在尺度空间寻找极值点&#xff0c;并提取出其位置、尺度、方向信息。 Sfit的应用范围包括物体辨别、机器人地图感知与导航、影像拼接、…

OpenCV 入门教程:膨胀和腐蚀操作

OpenCV 入门教程&#xff1a;膨胀和腐蚀操作 导语一、膨胀操作二、腐蚀操作三、示例应用3.1 图像增强3.2 边缘检测 总结 导语 膨胀和腐蚀是图像处理中常用的形态学操作&#xff0c;用于改变图像的形状和结构。在 OpenCV 中&#xff0c;膨胀和腐蚀是基于结构元素的像素操作&…

一零六三、进程调度算法模拟 (C语言实现)

目录 背景 程序实现 实现效果 背景 1、根据算法要求从键盘输入不少于四个进程信息&#xff08;包括进程名称、进程到达时间、估计运行时间&#xff09;&#xff0c;RR算法输入不少于两种时间片的大小 2、输出进程的调度顺序、完成时间、周转时间、平均周转时间、平均带权周转…

Openlayers实战:点击某点,overlay显示经纬度坐标

在之前的实战中,我们在某个固定的位置显示鼠标位置的经纬度, 今天改变一种形式,即采用overlay的方式,点击某处,获得到经纬度坐标,显示在overlay层上面。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑师兰特(CSDN) * @此源代码版权归大剑师兰特…

23款迈巴赫S480升级原厂主动式氛围灯+电动后门+前后手势感应

23款迈巴赫S480升级原厂主动式氛围灯原厂电动后门原厂手势控制 新车刚提&#xff0c;原厂配置升级&#xff0c;全新配件 配件齐全&#xff0c;准备上车 全套主动式氛围灯配件 氛围灯模块 前排驾驶位顶棚的手势感应 手势感应电脑模块 后排顶棚的手势感应 电动后门配件有锁机、电…

基于simulink使用光流法跟踪汽车(附源码)

一、前言 此示例演示如何使用光流估计在视频序列中检测和跟踪汽车。 二、模型 下图显示了使用光流跟踪汽车模型&#xff1a; 三、用光流结果跟踪汽车 该模型使用光流估计技术来估计视频序列的每一帧中的运动矢量。通过阈值化运动矢量&#xff0c;该模型创建包含移动对象斑点…

mysql学习--使用navicat查看数据库密码

数据库通常分为两种&#xff1a;关系型数据库和非关系型数据库,关系型数据库通常会建立很多二维数据表&#xff0c;形成一对一、一对多、多对多等关系&#xff1b;之后利用SQL语句查询我们所需要的数据&#xff1b;非关系型数据库基于Key-Value的对应关系&#xff0c;并且查询的…

机器学习 day24(多类分类模型,Softmax回归算法及其损失函数)

多类分类 多类分类问题仍然是分类问题&#xff0c;所以预测y的可能结果是少量的&#xff0c;而不是无穷多个&#xff0c;且对于多类分类它&#xff1e;2 如上图&#xff1a;左侧为二分类&#xff0c;右侧为多分类&#xff0c;可以通过决策边界来划分区域 Softmax回归算法 …

记录--在高德地图实现卷帘效果

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 介绍 今天介绍一个非常简单的入门级小案例&#xff0c;就是地图的卷帘效果实现&#xff0c;各大地图引擎供应商都有相关示例&#xff0c;很奇怪高德居然没有&#xff0c;我看了下文档发现其实也是可以…

Fastpillars论文解读

本论文是美团在pointpillar算法的基础上的改进。 主要改进点分为一下两个&#xff1a; 1.引入注意力机制对pillar内的特征进行提取&#xff0c;改善直接maxpooling导致的细粒度信息丢失。 2.参考CSPNet和RepVGG构建了一个全新的轻量化backbone。 一、pillar注意力机制特征提…

怎么把MP4转换成GIF?分享几个方法轻松转换!

如何将mp4转换为gif&#xff1f;在分享视频剪辑素材到社交媒体时&#xff0c;许多人会选择将其转换为gif格式。这是因为GIF文件加载速度更快&#xff0c;文件大小更小。此外&#xff0c;将MP4转换为GIF也方便人们在电子邮件和聊天应用程序中发送动态图像。下面&#xff0c;我们…

【Linux】文件描述符 (上篇)

文章目录 &#x1f4d6; 前言1. 文件的预备知识2. 复习C语言的文件操作3. Linux系统级文件接口3.1 open、 close、 read、 write 接口&#xff1a;3.2 内核当中实现的映射关系&#xff1a;3.3 如何理解Linux下一切皆文件&#xff1a; &#x1f4d6; 前言 本章开始&#xff0c;…

python绘制带有误差棒的条形图

文章目录 bar和barh加入误差棒定制误差棒颜色 bar和barh 在matplotlib中&#xff0c;通过bar和barh来绘制条形图&#xff0c;分别表示纵向和横向的条形图。二者的输入数据均主要为高度x和标签height&#xff0c;示例如下 import matplotlib.pyplot as plt import numpy as np…

MySQL CDC技术方案梳理

本篇主要探讨MySQL数据同步的各类常见技术方案及优劣势对比分析&#xff0c;从而更加深层次的理解方案&#xff0c;进而在后续的实际业务中&#xff0c;更好的选择方案。 1 CDC概念 CDC即Change Data Capture&#xff0c;变更数据捕获&#xff0c;即当数据发生变更时&#xff…

Ubuntu: scp命令使用及Permission denied错误解决方案

scp命令介绍 scp 命令用于 Linux 之间复制文件和目录。scp 是 secure copy 的缩写, scp 是 Ubuntu 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。 scp local_file remote_usernameremote_ip:remote_folder scp /Users/X.pem root192.168.1.247:/usr/local/ssl Permission…