【刷题笔记】数组-双指针||覆盖||重复元素

news2024/11/27 2:45:46

【刷题笔记】数组-双指针||覆盖||重复元素

目录

    • 移除元素
    • 删除有序数组中的重复项
    • 删除有序数组中的重复项 II
    • 分析

移除元素

https://leetcode.cn/problems/remove-element/

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

class Solution(object):
    def removeElement(self, nums, val):
        if len(nums) == 0:
            return 0
        slow, fast = 0, 0
        while fast < len(nums):
            if nums[fast] != val:
                nums[slow] = nums[fast]
                slow = slow + 1
            fast = fast + 1
        return slow

删除有序数组中的重复项

https://leetcode.cn/problems/remove-duplicates-from-sorted-array/
给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
返回 k 。

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        slow, fast = 1, 1
        while fast < len(nums):
            if nums[slow - 1] != nums[fast]:
                nums[slow] = nums[fast]
                slow = slow + 1
            fast = fast + 1
        return slow

删除有序数组中的重复项 II

https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

class Solution {
    public int removeDuplicates(int[] nums) {
        if (nums.length <= 2) return nums.length;
        int slow = 2, fast = 2;
        while (fast < nums.length) {
            if (nums[slow - 2] != nums[fast])
                nums[slow++] = nums[fast];
            fast++;
        }
        return slow;
    }
}

分析

这一类题目,在数组中原地修改,这种题目,经常利用后面的元素将前面的元素覆盖。这涉及到两个指针,一个slow,一个fastslow代表我们当前的索引,该索引位置有两个可能操作:保留覆盖fast表示真正的遍历索引,判断该元素是否符合题目要求,如果符合,则利用该元素覆盖slow位置。

比如删除有序数组中的重复项 II题目中,我们首先设置slow=0fast=0。然后设置大体框架:

slow, fast = 0, 0
while (fast < len(nums)): 
    ...

我们看到,fast是真实的遍历指针,所以判断遍历的框架也是利用fast

接下来,判断fast是否满足条件nums[fast] != val,如果满足条件,则将该元素在slow位置上覆盖。

而对于删除多个重复项这个问题,我们依然满足这个框架,

slow, fast
while fast < len(nums): 
    ...

在这里插入图片描述

在做算法题的时候,我们需要用一般性思维,即不要一上来就考虑初始条件或者边界条件,而是要从一般情况下考虑问题。

假设我们已经到算法中间的某一步,此时我们认为slow之前的元素都已经满足要求,那么fast什么时候可以覆盖重写slow位置上的元素呢?

如上图,假设 v m v_m vm可以放在slow的位置,那么 v m v_m vm不应该和 v k − 2 v_{k-2} vk2相等。因为什么?再次强调,我们应该具备一般思维,当我们的指针走到slow的时候,slow之前的元素完全满足每个元素最多有两个,也就是说,最坏的情况就是 v k − 2 = v k − 1 = v m v_{k-2}=v_{k-1}=v_m vk2=vk1=vm,即:

nums[slow-2] == nums[slow-1] and  
nums[slow-1] == nums[fast]

❓但是我们发现,在代码中的判定条件只有nums[slow-2]nums[fast]?因为数组是有序的,如果nums[slow-2] == nums[fast],则证明nums[slow-1]也等于nums[fast]。如果nums[slow-2] != nums[fast],则有两种情况:nums[slow-1]等于或者不等于nums[fast],而这两种情况都是满足要求的。

所以我们补全代码:

while fast < len(nums): 
    if nums[slow - 2] != nums[fast]: 
        nums[slow] = nums[fast]
        slow = slow + 1
    fast = fast + 1

当你刚写下nums[slow - 2]的时候,就有疑问了,要是初始设置slow=0,那这一步就该报错了。这说明,我们初始的时候应该设置slowfast都为2,因为nums的前两个元素一定满足要求,判断过程从第三个元素开始。

按照题目要求,最后我们要返回新数组的长度,我们看更新过程:

nums[slow] = nums[fast]
slow = slow + 1

首先,slow被更新,然后slow前进一步,那么当最后一个元素被填入slow之后,slow加一,即比最后一个合理元素的索引大1,也就是长度。最后直接返回slow

class Solution(object):
    def removeDuplicates(self, nums):

        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) <= 2:
            return len(nums)
        slow, fast = 2, 2
        while fast < len(nums):
            if nums[slow - 2] != nums[fast]:
                nums[slow] = nums[fast]
                slow = slow + 1
            fast = fast + 1
        return slow

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

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

相关文章

90. 打家劫舍II (房子围成一圈)

题目 题解 class Solution:def rob(self, nums: List[int]) -> int:def dp(nums: List[int]) -> int:N len(nums)# 定义状态&#xff1a;dp[i]表示从第i个房屋开始偷窃&#xff0c;能够偷到的最高金额dp [0 for i in range(N)]for i in range(N-1, -1, -1):if i N-1:…

软件工程期末复习(选择+填空+判断)

文章目录 软件工程期末复习一、 选择题 软件工程期末复习 一、 选择题 1.“软件危机”的表现不包括&#xff1a;&#xff08;c&#xff09; A、软件产品不能按期交付 B、用户对“已完成的”软件产品时常不满意 C、程序员越来越供不应求 D、软件项目难以管理&#xff0c;维护困…

各平台chatGPT使用体验(国内外)

首推&#xff1a;openAI 地址&#xff1a;https://chat.openai.com/ 这个真的很好用&#xff0c;而且回复的结果也基本让让人满意&#xff0c;个人首推&#xff0c;而且对比国内的除了回答更令人满意外&#xff0c;它更连贯&#xff0c;不像国内的gpt一句一问&#xff0c;跟进…

RabbitMQ之延迟消息实战

RabbitMQ之延迟消息实战 使用死信交换机实现延迟消息 使用死信交换机的过期时间以及没有消费者进行消费&#xff0c;时间到了就会到死信队列中&#xff0c;由此可以实现延迟消息使用延迟消息插件 前提&#xff1a;需要mq配置插件 延时信息案例实战 把一个30分钟的延迟消息可以…

Nginx(八) aio sendfile directio 组合使用测试(1)

thread_pool default threads32 max_queue65535; http {aio threadsdefault;directio 2m;sendfile on;sendfile_max_chunk 1m;#### Gzip压缩服务配置#gzip off; # 设置是否开启gzip压缩服务&#xff0c;用于提高传输速度&#xff0c;默认关闭(off)。#gzi…

B034-员工管理系统-JavaBean_EL_JSTL_MVC思想

目录 JavaBeanEL表达式JSTLMVC和三层架构 JavaBean 包括概述&#xff0c;规范&#xff0c;属性&#xff0c;内省机制和BeanUtils&#xff0c;详情见文档和代码 EL表达式 可以来用取四大作用域里的共享数据 包括介绍&#xff0c;获取值和运算&#xff0c;见文档与代码 tips…

【Skynet 入门实战练习】实现网关服务 | 用户代理 | RPC 协议 | 客户端

文章目录 前言网关服务RPC 协议看门狗服务代理服务客户端逻辑梳理 前言 上两章学习了如何搭建一个项目&#xff0c;简单实现了几个基础模块。本章节会实现基本的客户端与服务端的通信&#xff0c;包括网关&#xff08;gate&#xff09;、看门狗&#xff08;watchdog&#xff0…

JPA 方式实现 RESTful API

除了常见的方式实现 RESTful API&#xff0c;还有一种简单的方式实现 RESTful API&#xff0c;那就是用 JPA 方式。首先介绍一下 JPA&#xff0c;它是 Sun 公司推荐的 JAVA 持久化规范&#xff0c;为了简化 ORM 技术而产生。需要注意的是&#xff0c;他只是一套规范&#xff0c…

如何通过nginx进行服务的负载均衡

简单介绍 随着互联网的发展&#xff0c;业务流量越来越大并且业务逻辑也越来越复杂&#xff0c;单台服务器的性能及单点故障问题就凸显出来了&#xff0c;因此需要多台服务器组成应用集群&#xff0c;进行性能的水平扩展以及避免单点故障的出现。应用集群是将同一应用部署到多台…

相机成像基础

一、引言 在这个内卷的时代&#xff0c;手机厂商也在内卷"影像"&#xff0c;每次新品发布&#xff0c;都将影像效果带到一个新的高度。你是否好奇过&#xff0c;手机或者相机是如何记录下我们的幸福时刻的&#xff0c;本篇文章从相机成像基本流程、相机成像原理以及…

百度 Comate 终于支持 IntelliJ IDEA 了

大家好&#xff0c;我是伍六七。 对于一直关注 AI 编程的阿七来说&#xff0c;编程助手绝对是必不可少的&#xff0c;除了 GitHub Copilot 之外&#xff0c;国内百度的 Comate 一直是我关注的重点。 但是之前&#xff0c;Comate 还支持 VS code&#xff0c;并不支持 IntelliJ…

集线器-交换机-路由器

1.集线器(Hub) 集线器就是将网线集中到一起的机器&#xff0c;也就是多台主机和设备的连接器。集线器的主要功能是对接收到的信号进行同步整形放大&#xff0c;以扩大网络的传输距离&#xff0c;是中继器的一种形式&#xff0c;区别在于集线器能够提供多端口服务&#xff0c;也…

机器学习基础Matplotlib绘图

一、运行环境 学习工具&#xff1a;jupyter-notebookpython版本&#xff1a;311系统&#xff1a;Win11 二、什么是matplotlib&#xff1f; matplotlib是基于python生态开发的一个可视化绘图库&#xff0c;它的出现让python在数据分析及机器学习方面占了重要的一部分&#…

【二叉树】oj题

在处理oj题之前我们需要先处理一下之前遗留的问题 在二叉树中寻找为x的节点 BTNode* BinaryTreeFind(BTNode* root, int x) {if (root NULL)return NULL;if (root->data x)return root;BTNode* ret1 BinaryTreeFind(root->left, x);BTNode* ret2 BinaryTreeFind(ro…

uiautomator2 无法连接 ATX-Agent

最近需要写个安卓自动项目&#xff0c;本身不想用appium 。主要是appium需要安装的依赖太多&#xff0c;一单换个环境又要配置新的环境。但是ATX-Agent装好之后怎么都连接不是。 报错信息如下&#xff1a; .........省略............ uiautomator2.exceptions.GatewayError: (…

OD机考真题搜集:叠积木1

题目 有一堆长方体积木,它们的高度和宽度都相同,但长度不一。 小橙想把这堆积木叠成一面墙,墙的每层可以放一个积木,或将两个积木拼接起来,要求每层的长度相同。若必须用完这些积木,叠成的墙最多为多少层?如下是叠成的一面墙的图示,积木仅按宽和高所在的面进行拼接。 …

[Spring] 字节一面~Spring 如何解决循环依赖问题 以及 @resource 与 @autowire 同时存在时谁生效

文章目录 Spring 如何解决循环依赖问题resource 与 autowire 同时存在时谁生效 Spring 如何解决循环依赖问题 Spring在实例化一个bean的时候&#xff0c;是首先递归实例化其所依赖的所有bean&#xff0c;直到某个bean没有依赖其他bean&#xff0c;此时就会将该实例返回&#x…

python基础练习题库实验4

文章目录 题目1代码实验结果 题目2代码实验结果 题目3代码实验结果 题目4代码实验结果 题目5代码实验结果 题目6代码实验结果 题目总结 题目1 编写一个程序&#xff0c;使用for循环语句和字符串格式显示以下精确输出。 例如&#xff1a; 代码 for i in range(1, 11):result…

如何在Node.js和Express中设置TypeScript(2023年)

如何在Node.js和Express中设置TypeScript&#xff08;2023年&#xff09; 在这篇文章中&#xff0c;我们将介绍在Express应用程序中设置TypeScript的最佳方法&#xff0c;了解与之相关的基本限制。 文章目录 如何在Node.js和Express中设置TypeScript&#xff08;2023年&#x…

智能优化算法应用:基于鲸鱼算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鲸鱼算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鲸鱼算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鲸鱼算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…