2024.4.29力扣刷题记录-数组篇记录4

目录

一、697. 数组的度

二、448. 找到所有数组中消失的数字

三、442. 数组中重复的数据

四、 41. 缺失的第一个正数

五、485. 最大连续 1 的个数


一、697. 数组的度

哈希表

class Solution:
    def findShortestSubArray(self, nums: List[int]) -> int:
        # 哈希表
        # 找出最大度值第一次出现和最后一次出现的位置
        # 最大度值可能不止一个
        hash = {}
        for i, x in enumerate(nums):
            # 记录次数,第一次出现位置,最后一次出现位置
            cnt, first, last = hash.get(x, (0, 0, 0))
            if cnt == 0:
                # 第一次出现
                first, last = i, i
                cnt += 1
            else:
                last = i    # 更新最近一次出现的位置
                cnt += 1
            hash[x] = (cnt, first, last)
        # 对值进行排序
        v = sorted(list(hash.values()), reverse = True)
        maxCnt, minLen = v[0][0], v[0][2] - v[0][1]
        for i in range(1, len(v)):
            # 在最大度值中找最小长度
            if v[i][0] != maxCnt:
                break
            minLen = min(minLen, v[i][2] - v[i][1])
        return minLen + 1   #长度是坐标差加一

二、448. 找到所有数组中消失的数字

 1.哈希表

class Solution:
    def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
        # 哈希表
        # 时复O(n)
        ans = []
        hash = Counter(nums)
        n = len(nums)
        for i in range(1, n + 1):
            if i not in hash.keys():
                ans.append(i)
        return ans

2.集合运算

class Solution:
    def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
        # 集合运算
        return list(set(range(1, len(nums) + 1)) - set(nums))

3.原地运算,来自官方题解(. - 力扣(LeetCode))。

时复为O(n),无额外空间。太妙了这个方法。题目中的元素范围信息(属于[ 1, n ])也很重要。

class Solution:
    def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
        # 原地运算
        # 在原数组上运算,相当于一个数组两用
        n = len(nums)
        for num in nums:
            x = (num - 1) % n
            # x = num % n - 1     #对于python索引来说是一样的
            # 但是还是尽量避免出现负数,比如num == n时
            nums[x] += n    # 通过使用统一额外的值来表示,起到避免更改原数字且储存信息的作用
        ans = [i + 1 for i, x in enumerate(nums) if x <= n]
        return ans

三、442. 数组中重复的数据

1.原地操作,类比上一题

class Solution:
    def findDuplicates(self, nums: List[int]) -> List[int]:
        # 原地操作
        n = len(nums)
        for num in nums:
            x = (num - 1) % n
            nums[x] += n
        return [i + 1 for i, x in enumerate(nums) if x > 2 * n]     
        # 注意是大于,原值是大于等于1的

2.原地操作2,使用正负号标记。来自官方题解(. - 力扣(LeetCode))。

class Solution:
    def findDuplicates(self, nums: List[int]) -> List[int]:
        # 原地操作2,使用正负号标记
        ans = []
        for x in nums:
            x = abs(x)
            if nums[x - 1] > 0:
                # x第一次出现
                nums[x - 1] = - nums[x - 1]
            else:
                # x第二次出现
                # 最多只会出现两次所以没问题
                ans.append(x)
        return ans

3.原地交换,来自官方题解。

class Solution:
    def findDuplicates(self, nums: List[int]) -> List[int]:
        # 原地交换
        for i in range(len(nums)):
            # 让x放第x位
            while  nums[nums[i] - 1] != nums[i]:
                # 第x位不等于x
                # 不等代表第一次出现,放到对应位置
                # 等代表第二次出现,不用管,任意交换到何处都可
                tmp = nums[i]   # 此处不要直接进行交换
                nums[tmp - 1], nums[i] = nums[i], nums[tmp - 1]
        return [x for i, x in enumerate(nums) if x - 1 != i]

这里使用tmp的原因来自评论(. - 力扣(LeetCode))。

四、 41. 缺失的第一个正数

不会,来自官方题解(. - 力扣(LeetCode))。本质是要抓住“对于一个长度为 N 的数组,其中没有出现的最小正整数只能在 [1, N+1] 中。”,再将数字范围进行限制,转化为之前做过的题型。

 1.原地哈希

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        # 对于一个长度为 N 的数组,其中没有出现的最小正整数只能在 [1, N+1] 中
        # 哈希表
        # 将无限制改为有限制
        n = len(nums)
        for i in range(n):
            if nums[i] <= 0:
                nums[i] = n + 1
        # 做标记
        for x in nums:
            x = abs(x)
            if x <= n:
                # 只需要管该区域
                if nums[x - 1] > 0:
                    nums[x - 1] *= -1
        for i, x in enumerate(nums):
            if x > 0:
                return i + 1
        return n + 1

2.原地置换

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        # 对于一个长度为 N 的数组,其中没有出现的最小正整数只能在 [1, N+1] 中
        # 原地置换
        n = len(nums)
        for i in range(n):
            # 只将需要放回原位的值放回即可
            while nums[i] > 0 and nums[i] <= n and nums[nums[i] - 1] != nums[i]:
                x = nums[i]
                nums[x - 1], nums[i] = nums[i], nums[x - 1]
        for i, x in enumerate(nums):
            if x - 1 != i:
                return i + 1
        return n + 1

五、485. 最大连续 1 的个数

1.滑动窗口

class Solution:
    def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
        # 滑动窗口
        n = len(nums)
        ans = 0
        l, r = 0, 0
        while l < n:
            while r < n and nums[l] == nums[r]:
                r += 1
            if nums[l] == 1:
                # 中间都为1时更新
                ans = max(ans, r - l)
            l = r   # 直接跳转,中间都是相同的
        return ans

2.一次遍历,来自官方题解(. - 力扣(LeetCode))。

class Solution:
    def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
        # 一次遍历
        maxCnt, cnt = 0, 0
        for x in nums:
            if x == 1:
                cnt += 1
            else:
                # 更新
                maxCnt = max(maxCnt, cnt)
                cnt = 0
        # 最后一位
        maxCnt = max(maxCnt, cnt)
        return maxCnt

感谢你看到这里!一起加油吧!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Verdin AM62 LVGL 移植

By Toradex胡珊逢 简介 LVGL 是一个免费、开源的图形库&#xff0c;能够在嵌入式设备如上使用 C/C 语言轻松绘制图形。由于这是一轻量级图形库&#xff0c;最初广泛被 MCU 处理器使用。随着功能完善&#xff0c;在性能和资源更充裕的 MPU 上也逐渐被使用。文章将介绍如何在 V…

币圈Cryptosquare论坛

Cryptosquare综合性资讯论坛汇集了币圈新闻、空投信息、社会热点以及与Web3相关的工作信息。让我们一起解锁加密世界的种种可能性&#xff0c;探索Cryptosquare论坛带来的精彩&#xff01; 币圈新闻板块&#xff1a; Cryptosquare论坛的币圈新闻板块是用户获取最新加密货币行业…

人工 VS AGV无人搬运机器人,AGV赋能中国智能制造

agv 机器人作为智能制造的重要抓手&#xff0c;正在渗透到各个传统行业&#xff0c;成为我国制造业转型升级的焦点。未来&#xff0c;智能AGV将不仅仅是简单的把货物搬运到指定的位置&#xff0c;而是要把5G技术、大数据、物联网、云计算等贯穿于产品的设计中&#xff0c;让智能…

【Java EE】日志框架(SLF4J)与门面模式

文章目录 &#x1f340;SLF4j&#x1f333;门面模式(外观模式)&#x1f338;门面模式的定义&#x1f338;门面模式的模拟实现&#x1f338;门面模式的优点 &#x1f332;关于SLF4J框架&#x1f338;引入日志门面 ⭕总结 &#x1f340;SLF4j SLF4J不同于其他⽇志框架,它不是⼀个…

LLM之RAG理论(十一)| 面向生产的RAG应用程序的12种调整策略指南

本文对文本RAG涉及到的主要12种关键“超参数”进行简单总结&#xff0c;主要包括摄取阶段&#xff08;数据清洗、数据分块、embedding模型选择、元数据过滤、多重索引和索引算法&#xff09;和推理阶段【检索和生成】&#xff08;查询转换、检索参数、高级检索策略、重排序、大…

React的数据Mock实现

在前后端分类的开发模式下&#xff0c;前端可以在没有实际后端接口的支持下先进行接口数据的模拟&#xff0c;进行正常的业务功能开发 1. 常见的Mock方式 2. json-server实现Mock 实现步骤&#xff1a; 项目中安装json-server npm i -D json-server准备一个json文件 {"…

大数据开发工作中的数仓设计(Hadoop,hive ,mysql )

1.HUE工具介绍使用 HUE是CDH提供一个hive和hdfs的操作工具&#xff0c;在hue中编写了hiveSQl也可以操作hdfs的文件 http://主机名字:端口号 hdfs的web访问端口 http://主机名字:端口号 hdfs的程序访问端口 进入后确保hdfs hive yarn 开启 在点击hue开启 在这里面也可以进行h…

记录k8s以docker方式安装Kuboard v3 过程

原本是想通过在k8s集群中安装kuboad v3的方式安装kuboard&#xff0c;无奈在安装过程中遇到了太多的问题&#xff0c;最后选择了直接采用docker安装的方式&#xff0c;后续有时间会补上直接采用k8s安装kuboard v3的教程。 1.kuboard安装文档地址&#xff1a; 安装 Kuboard v3 …

华为 huawei 交换机 配置 MUX VLAN 示例(汇聚层设备)

组网需求 在企业网络中&#xff0c;企业所有员工都可以访问企业的服务器。但对于企业来说&#xff0c;希望企业内部部分员工之间可以互相交流&#xff0c;而部分员工之间是隔离的&#xff0c;不能够互相访问。 如 图 6-4 所示&#xff0c; Switch1 位于网络的汇聚层&#xff0…

【百度Apollo】探索自动驾驶:小白教学如何使用 Dreamview 播放数据包

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引入一、Dreamview 简介二、使用 Dreamview 具体步骤步骤一&#xff1a;进入 Apollo Docker 环境步骤二&#xff…

Qt QThreadPool线程池

1.简介 QThreadPool类管理一个QThread集合。 QThreadPool管理和重新设计单个QThread对象&#xff0c;以帮助降低使用线程的程序中的线程创建成本。每个Qt应用程序都有一个全局QThreadPool对象&#xff0c;可以通过调用globalInstance来访问该对象。 要使用其中一个QThreadPool…

VMware安装ubuntun虚拟机使用桥接模式无法上网问题解决

问题&#xff1a;最近准备使用VMware虚拟机搭建k8s集群服务&#xff0c;因为需要在同一个网段下&#xff0c;我使用桥接的方式&#xff0c;我发现主机在使用有线连接时虚拟机网络连接正常&#xff0c;但是使用无线网就显示连接不上网络。 解决方法 一、查看网络连接&#xff…

软考-信息系统项目管理师-论文技术架构模板(60天备考第26天)

分享一段信息系统项目管理师论文项目技术架构描述的万能模板&#xff0c;供大家参考。距离考试还有二十八天&#xff0c;如果论文写不好的可以加微进论文指导群学习论文写作。 该系统前端基于Vue开发&#xff0c;后端基于java开发&#xff0c;前后端分离部署。整体采用B/S架构&…

【论文阅读笔记】Frequency Perception Network for Camouflaged Object Detection

1.论文介绍 Frequency Perception Network for Camouflaged Object Detection 基于频率感知网络的视频目标检测 2023年 ACM MM Paper Code 2.摘要 隐蔽目标检测&#xff08;COD&#xff09;的目的是准确地检测隐藏在周围环境中的目标。然而&#xff0c;现有的COD方法主要定位…

java中的对象拷贝(包括BeanUtils和Mapstruct)

对象拷贝 借鉴&#xff1a; https://blog.csdn.net/weixin_43811057/article/details/122853749https://blog.csdn.net/weixin_42036952/article/details/105697234?spm1001.2101.3001.6650.8&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogComme…

目标检测应用场景—数据集【NO.33】血细胞图像分类和检测数据集

写在前面&#xff1a;数据集对应应用场景&#xff0c;不同的应用场景有不同的检测难点以及对应改进方法&#xff0c;本系列整理汇总领域内的数据集&#xff0c;方便大家下载数据集&#xff0c;若无法下载可关注后私信领取。关注免费领取整理好的数据集资料&#xff01;今天分享…

LVS/NAT工作模式介绍及配置

1.1 LVS/NAT模式工作原理 LVS&#xff08;Linux Virtual Server&#xff09;的网络地址转换&#xff08;NAT&#xff09;模式是一种在网络层&#xff08;第四层&#xff09;实现负载均衡的方法。在NAT模式中&#xff0c;Director Server&#xff08;DS&#xff09;充当所有服务…

leetcode51.N皇后(困难)-回溯法

思路 都知道n皇后问题是回溯算法解决的经典问题&#xff0c;但是用回溯解决多了组合、切割、子集、排列问题之后&#xff0c;遇到这种二维矩阵还会有点不知所措。 首先来看一下皇后们的约束条件&#xff1a; 不能同行不能同列不能同斜线 确定完约束条件&#xff0c;来看看究…

UE5 体积云

写好的体积材质放这里面 效果如上 Begin Object Class/Script/UnrealEd.MaterialGraphNode Name"MaterialGraphNode_4"Begin Object Class/Script/Engine.MaterialExpressionVectorParameter Name"MaterialExpressionVectorParameter_0"End ObjectBegin O…

人工智能_大模型044_模型微调004_随机梯度下降优化_常见损失计算算法_手写简单神经网络_实现手写体识别---人工智能工作笔记0179

然后对于,梯度下降,为了让训练的速度更好,更快的下降,又做了很多算法,可以看到 这里要知道Transformer中最常用的Adam 和 AdamW这两种算法. 当然,这些算法都是用于优化神经网络中的参数,以最小化损失函数。下面我会尽量以通俗易懂的方式解释它们的原理和适用场景。 1. **L-…
最新文章