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

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

目录

    • 移除元素
    • 删除有序数组中的重复项
    • 删除有序数组中的重复项 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 0slow, fast = 0, 0while fast < len(nums):if nums[fast] != val:nums[slow] = nums[fast]slow = slow + 1fast = fast + 1return 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, 1while fast < len(nums):if nums[slow - 1] != nums[fast]:nums[slow] = nums[fast]slow = slow + 1fast = fast + 1return 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 + 1fast = 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, 2while fast < len(nums):if nums[slow - 2] != nums[fast]:nums[slow] = nums[fast]slow = slow + 1fast = fast + 1return slow

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

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

相关文章

FreeRTOS任务创建及细节

目录 任务创建 简化的TCB结构体 创建任务堆栈和任务TCB 初始化任务TCB的成员 初始化任务堆栈 把新任务添加到就绪列表 任务创建 BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,const char * const pcName, /*lint !e971 Unqualified char types are allowed for …

第一篇:快速入门

简介 本篇文章主要目的教你如何快速的理解、掌握cocos shader的相关知识&#xff0c;并附加实践案例。 shader 我们可以理解为是一种在图形渲染过程中控制像素颜色的过程&#xff0c;通常用来创建各种视觉效果。如光照、阴影、扭曲等。 Material&#xff08;材质&#xff0…

ps5ps4游戏室如何计时?计费系统怎么查看游戏时间以及收费如何管理

ps5ps4游戏室如何计时&#xff1f;计费系统怎么查看游戏时间以及收费如何管理 1、ps5ps4游戏室如何计时&#xff1f; 下图以佳易王计时计费软件V17.9为例说明 在开始计时的时候&#xff0c;只需点 开始计时按钮&#xff0c;那么开台时间和使用的时间长度项目显示在屏幕上&am…

代码随想录算法训练营 ---第四十四天

今天开始《动态规划&#xff1a;完全背包》的学习&#xff01; 前言&#xff1a; 完全背包和01背包的区别在于完全背包里的物品能无限次使用&#xff0c;01背包只能用一次。 第一题&#xff1a; 简介&#xff1a; 本题是纯完全背包的使用。可以看一看和01背包的区别。 代码…

数据结构-二叉树(1)

1.树概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 1.有一个特殊的结点&…

SpringBoot详解

一、介绍 Spring Boot 是一个基于 Spring 框架的开源框架&#xff0c;用于构建微服务和 Web 应用程序。它可以帮助开发者轻松创建独立的、基于 Spring 的应用程序&#xff0c;并在较短的时间内完成项目的开发。 二、核心 1. 约定大于配置 Spring Boot 通过自动化配置、约定优…

电压调整型脉宽调制控制集成电路芯片D7500,工作电压范围7V ~ 40V,输出电流(Max)可达200mA,具有欠压锁定功能

D7500/D7500F SMPS 控制器电路&#xff0c;是一块电压调整型脉宽调制控制集成电路。内部包含5V 基准电压电路、两个误差放大器、触发电路、控制输出电路、脉宽调制比较 器、死区时间比较器及一个 振荡器。该电路可转换频率1kHz至300kHz&#xff0c; 基准电压(Vref)的精确度提…

大数据Doris(三十):删除数据(Delete)

文章目录 删除数据(Delete) 一、​​​​​​​DELETE FROM Statement(条件删除)

pandas根据列正逆序排序

题目&#xff1a;根据 buy_quantity 列进行排名&#xff0c;相同值分配相同的最低排名。 import pandas as pd# 创建一个示例 DataFrame data {item_id: [1, 2, 3, 4, 5, 6, 7], buy_quantity: [1, 2, 2, 3, 3, 4, 5]} df pd.DataFrame(data)# 使用 rank() 函数为 buy_quant…

git报错:error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413

git报错&#xff1a;error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 如图&#xff1a; error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 send-pack: unexpected disconnect while reading sideband packet fatal: th…

【Spring整合Junit】Spring整合Junit介绍

本文内容基于【Spring整合MyBatis】Spring整合MyBatis的具体方法进行测试 文章目录 1. 导入相关坐标2. 使用Junit测试所需注解3. 在测试类中写相关内容 1. 导入相关坐标 在pom.xml中导入相关坐标&#xff1a; <dependency><groupId>junit</groupId><ar…

Redis 面试题——持久化

目录 1.概述1.1.Redis 的持久化功能是指什么&#xff1f;1.2.Redis 有哪些持久化机制&#xff1f; 2.RDB2.1.什么是 RDB 持久化&#xff1f;2.2.Redis 中使用什么命令来生成 RDB 快照文件&#xff1f;2.3.如何在 Redis 的配置文件中对 RDB 进行配置&#xff1f;2.4.✨RDB 持久化…

人才“塔尖城市”,长沙如何炼成?

文 | 智能相对论 作者 | 范柔丝 长沙在人才吸引力上&#xff0c;近几年来可谓风头无二。 自2022年长沙人才政策“升级版45条”实施以来&#xff0c;越来越多的人才因为长沙真金白银的政策与城市发展机遇&#xff0c;奔赴长沙安居乐业。 随着2023互联网岳麓峰会吹响长沙全力…

[蓝桥杯训练]———高精度乘法、除法

高精度乘法、除法 一、高精度乘法⭐1.1 初步理解1.1.1 高精度的定义1.1.2 为什么会有高精度1.1.3 高精度乘法的复杂度 1.2 思想讲解1.3 代码实现1.3.1 声明1.3.2 实现高精度乘法1.3.3 整体实现1.3.4 代码测试 二、高精度除法⭐2.1 初步理解2.2 思想讲解2.3 代码实现2.3.1 声明2…

JDBC编程基础

JDBC编程基础 JDBC介绍创建JDBC项目的步骤1.引入依赖2.注册驱动3.获取数据库连接4.获取sql执行对象 JDBC 常用 API 详解sql执行对象PreparedStatement作用 事务管理结果集对象 JDBC项目demo测试 JDBC介绍 每个数据库都会提供一组API来支持程序员实现自己客户端&#xff0c;自己…

矩阵置零[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定一个m x n的矩阵&#xff0c;如果一个元素为0&#xff0c;则将其所在行和列的所有元素都设为0。请使用原地算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[…

线性分类器---损失函数与优化算法

如何衡量分类器对当前样本的效果好坏&#xff1f; 需要损失函数 什么是损失函数&#xff1f; 损失函数搭建了模型性能与模型参数之间的桥梁&#xff0c;指导 模型参数优化。  损失函数是一个函数&#xff0c;用于度量给定分类器的预测值与真实值 的不一致程度&#xff0c;…

基于单片机病房呼叫程序和仿真

如果学弟学妹们在毕设方面有任何问题&#xff0c;随时可以私信我咨询哦&#xff0c;有问必答&#xff01;学长专注于单片机相关的知识&#xff0c;可以解决单片机设计、嵌入式系统、编程和硬件等方面的难题。 愿毕业生有力&#xff0c;陪迷茫着前行&#xff01; 一、系统方案 1…

香港科技大学广州|智能制造学域博士招生宣讲会—天津大学专场

时间&#xff1a;2023年12月07日&#xff08;星期四&#xff09;15:30 地点&#xff1a;天津大学卫津路校区26楼B112 报名链接&#xff1a;https://www.wjx.top/vm/mmukLPC.aspx# 宣讲嘉宾&#xff1a; 汤凯教授 学域主任 https://facultyprofiles.hkust-gz.edu.cn/faculty-p…

OpenStack云计算平台-Networking 服务

目录 一、网络服务概览 二、网络&#xff08;neutron&#xff09;概念 三、安装并配置控制节点 1、先决条件 2、配置网络选项&#xff08;公共网络&#xff09; &#xff08;1&#xff09;安装组件 &#xff08;2&#xff09;配置服务组件 &#xff08;3&#xff09;配…