leetcode-数组-双指针

主要分为两种情况(1)快慢指针(2)背向、对向指针-> <-

126.删除有序数组中的重复项

相关标签

相关企业

提示

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

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

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

判题标准:

系统会用下面的代码来测试你的题解:

int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案

int k = removeDuplicates(nums); // 调用

assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
    assert nums[i] == expectedNums[i];
}

如果所有断言都通过,那么您的题解将被 通过

示例 1:

输入:nums = [1,1,2]
输出:2, nums = [1,2,_]

示例 2:

输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]

提示:

  • 1 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • nums 已按 非严格递增 排列

解题思路

使用双指针法,慢指针 i 用于记录无重复元素的位置,快指针 j 遍历整个数组。

代码实现

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
    if (nums.length === 0) return nums; // 如果数组为空,直接返回

    let i = 0; // 慢指针,指向当前唯一元素的位置
    for (let j = 1; j < nums.length; j++) { // 快指针,遍历数组
        if (nums[j] !== nums[i]) { // 如果发现新元素
            i++; // 慢指针右移
            nums[i]=nums[j];     
        }
    }
    return i+1; // 返回修改后的数组
};

27. 移除元素

27.移除元素

相关标签

相关企业

提示

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k

用户评测:

评测机将使用以下代码测试您的解决方案:

int[] nums = [...]; // 输入数组
int val = ...; // 要移除的值
int[] expectedNums = [...]; // 长度正确的预期答案。
                            // 它以不等于 val 的值排序。

int k = removeElement(nums, val); // 调用你的实现

assert k == expectedNums.length;
sort(nums, 0, k); // 排序 nums 的前 k 个元素
for (int i = 0; i < actualLength; i++) {
    assert nums[i] == expectedNums[i];
}

如果所有的断言都通过,你的解决方案将会 通过

示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2,_,_]
解释:你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。
你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。

示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3,_,_,_]
解释:你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。
注意这五个元素可以任意顺序返回。
你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。

提示:

  • 0 <= nums.length <= 100
  • 0 <= nums[i] <= 50
  • 0 <= val <= 100

解题思路

慢指针 i :指向当前可以放置不等于 val 的元素的位置。 

快指针 j :遍历数组,检查每个元素是否等于 val 。

移动元素 :如果 nums[j] !== val ,则将 nums[j] 放到 nums[i] 的位置,并移动慢指针 i 。 

返回结果 :最终 i 的值就是不等于 val 的元素数量。

代码实现

/**
 * @param {number[]} nums
 * @param {number} val
 * @return {number}
 */
var removeElement = function(nums, val) {
    let i=0;//慢指针
    for(let j=0;j<nums.length;j++){//快指针
        if(nums[j]!==val){
            nums[i]=nums[j];
            i++;//指针右移
        }
    }
    return i;//返回不等于val的元素数量
};

66. 加一

66.加一

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。

示例 2:

输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。

示例 3:

输入:digits = [9]
输出:[1,0]
解释:输入数组表示数字 9。
加 1 得到了 9 + 1 = 10。
因此,结果应该是 [1,0]。

提示:

  • 1 <= digits.length <= 100
  • 0 <= digits[i] <= 9

解题思路

这是模拟加法的过程,和数组无关。

这道题的目标是对一个用数组表示的非负整数加一,并返回结果数组。数组的每个元素表示数字的一位,最高位在数组的首位。

思路: 从最低位开始加一 :从数组的最后一个元素(最低位)开始,逐位加一。 处理进位 :如果某一位加一后变为 10 ,则需要将这一位置为 0 ,并向高位进位。 处理最高位进位 :如果最高位也需要进位(例如 [9,9] 加一后变为 [1,0,0] ),则需要在数组的最前面插入 1

代码实现

/**
 * @param {number[]} digits
 * @return {number[]}
 */
var plusOne = function(digits) {
    for(let i=digits.length-1;i>=0;i--){
        if(digits[i]<9) {
            digits[i]++;
            return digits
        }else{
            digits[i]=0;
        }
    }
    digits.unshift(1);
    return digits;
};

283.移动零

283. 移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

提示:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1

进阶:你能尽量减少完成的操作次数吗?

实现思路

使用 双指针法 : 

快慢指针 : 使用一个慢指针 slow 指向当前非零元素的位置。 使用一个快指针 fast 遍历数组。 当 nums[fast] 不为零时,将其赋值给 nums[slow] ,然后 slow++ 。

填充零 : 遍历结束后,将 slow 之后的所有位置填充为零。 这种方法的时间复杂度为 O(n) ,空间复杂度为 O(1) 。

代码实现

var moveZeroes = function(nums) {
    let slow=0;
    // 将非零元素移到前面
    for(let fast=0;fast<nums.length;fast++){
        if(nums[fast]!==0){
            nums[slow]=nums[fast]
            slow++
        }
    }
    // 剩余位置填充为0
    for(let i=slow ;i<nums.length;i++){
        nums[i]=0
    }

};

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

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

相关文章

如何用Kimi生成PPT?秒出PPT更高效!

做PPT是不是总是让你头疼&#xff1f;&#x1f629; 快速制作出专业的PPT&#xff0c;今天我们要推荐两款超级好用的AI工具——Kimi 和 秒出PPT&#xff01;我们来看看哪一款更适合你吧&#xff01;&#x1f680; &#x1f947; Kimi&#xff1a;让PPT制作更轻松 Kimi的生成效…

深入理解Java中的static关键字及其内存原理

static是Java中实现类级共享资源的核心修饰符&#xff0c;它突破了对象实例化的限制&#xff0c;使得变量和方法能够直接与类本身绑定。这种特性让static成为构建工具类、全局配置等场景的利器&#xff0c;但同时也带来独特的内存管理机制需要开发者关注。 static修饰成员变量…

Zemax 中的 CAD 文件性能比较

这些文件格式 STEP、IGS、SAT 和 STL 通常用于 3D 建模、CAD 和工程应用程序。STEP、IGS、SAT 和 STL 之间的主要区别在于它们如何在 CAD、工程和 3D 打印应用程序中存储和表示 3D 几何图形。 Zemax OpticStudio、STEP、IGES、SAT 和 STL 文件的性能可能会因文件类型和用例&am…

springboot 修复 Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38816)

一定要看到最后&#xff01; 一定要看到最后&#xff01; 一定要看到最后&#xff01; 一、漏洞描述 Spring框架是 Java 平台的一个开源的全栈应用程序框架和控制反转容器实现。2024年9月&#xff0c;Spring官方发布公告披露 CVE-2024-38816 Spring Framework 特定条件下目…

electron builder打包时,出现errorOut=ERROR: Cannot create symbolic link

解决办法&#xff1a; 以管理员身份运行PowerShell&#xff0c;然后进入到该目录下重新执行该指令。然后就会看到打包成功。 只要首次在PowerShell中链接创建完成&#xff0c;后续在VSCode或者CMD这些运行指令&#xff0c;都不会报错了

Tomcat下载安装及日志乱码问题解决

目录 tomcat下载安装 打开官网&#xff0c;选择想安装的版本 根据自己的电脑配置进行选择 tomcat安装 tomcat启动 启动窗口中文乱码问题 将tomcat日志配置改为GBK编码 修改系统区域设置 tomcat下载安装 访问tomcat官网&#xff1a;Apache Tomcat - Welcome! 打开官网&…

【贪心算法】简介

1.贪心算法 贪心策略&#xff1a;解决问题的策略&#xff0c;局部最优----》全局最优 &#xff08;1&#xff09;把解决问题的过程分成若干步 &#xff08;2&#xff09;解决每一步的时候&#xff0c;都选择当前看起来的“最优”的算法 &#xff08;3&#xff09;“希望”得…

J6打卡——pytorch实现ResNeXt-50实现猴痘检测

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 1.检查GPU import torch import torch.nn as nn import torchvision.transforms as transforms import torchvision from torchvision import transforms, d…

javaEE初阶————多线程进阶(2)

今天来继续带大家学习多线程进阶部分啦&#xff0c;今天是最后一期啦&#xff0c;下期带大家做一些多线程的题&#xff0c;我们就可以开始下一个环节啦&#xff1b; 1&#xff0c;JUC&#xff08;java.util.concurrent&#xff09;的常见类 1&#xff09;Callable 接口 我们之…

初次体验Tauri和Sycamore(3)通道实现

​ 原创作者&#xff1a;庄晓立&#xff08;LIIGO&#xff09; 原创时间&#xff1a;2025年03月10日&#xff08;发布时间&#xff09; 原创链接&#xff1a;https://blog.csdn.net/liigo/article/details/146159327 版权所有&#xff0c;转载请注明出处。 20250310 LIIGO备注&…

【2025力扣打卡系列】0-1背包 完全背包

坚持按题型打卡&刷&梳理力扣算法题系列&#xff0c;语言为python3&#xff0c;Day5 0-1背包【目标和】 有n个物品&#xff0c;第i个物品的体积为w[i], 价值为v[i]。每个物品至多选一个&#xff0c;求体积和不超过capacity时的最大价值和常见变形 至多装capacity&#x…

windows下使用msys2编译ffmpeg

三种方法&#xff1a; 1、在msys2中使用gcc编译 2、在msys2中使用visual studio编译&#xff08;有环境变量&#xff09; 3、在msys2中使用visual studio编译&#xff08;无环境变量&#xff09; 我的环境&#xff1a; 1、msys2-x86_64-20250221 2、vs2015 3、ffmpeg-7.1…

引领变革!北京爱悦诗科技有限公司荣获“GAS消费电子科创奖-产品创新奖”!

在2025年“GAS消费电子科创奖”评选中&#xff0c;北京爱悦诗科技有限公司提交的“aigo爱国者GS06”&#xff0c;在技术创新性、设计创新性、工艺创新性、智能化创新性及原创性五大维度均获得评委的高度认可&#xff0c;荣获“产品创新奖”。 这一奖项不仅是对爱悦诗在消费电子…

cesium地图设置3d,2d,2.5d动态切换

通过修改cesium实例vw的scene的显示模式&#xff0c;来切换最终的显示模式。 Cesium.SceneMode总共有四个变量值&#xff0c;分别如下&#xff1a;NameTypeDescriptionMORPHINGnumber在3d与2d之间切换变体 between mode, e.g., 3D to 2D.COLUMBUS_VIEWnumber2.5d模式&#xff0…

Spring Boot 解析 LocalDateTime 失败?Uniapp 传输时间变 1970 的原因与解决方案

目录 前言1. 问题分析2. 时间戳&#xff08;推荐&#xff0c;可尝试&#xff09;3. 使用 JsonDeserialize & JsonSerialize&#xff08;中立&#xff09;4. 前端传 ISO-8601 格式&#xff08;不推荐&#xff0c;可尝试&#xff09;5. 用 String&#xff08;中立&#xff09…

基于Spark的热门动漫推荐数据分析与可视化系统的设计与实现(采用Python语言Django框架,Hadoop,spider爬虫等技术实现)

基于Hadoop的热门动漫推荐数据分析与可视化系统 基于Django的热门动漫推荐数据分析与可视化系统 1. 开发工具和实现技术 Pycharm, Python3.7&#xff0c;Django框架&#xff0c;Hadoop&#xff0c;Spark&#xff0c;Hive&#xff0c;spider爬虫&#xff08;爬取动漫之家的动…

【Java学习】泛型

面向对象系列八 一、泛型类变量 二、泛型实现 1.编译检查 2.类型擦除 3.泛型效果 三、类型检查 1.向上转型相关&#xff1a; 2.数组相关&#xff1a; 四、extend 1.非泛型下&#xff1a; 2.泛型中&#xff1a; 一、泛型类变量 一个类变量对里面位置引用变量的类型通泛…

nnMamba:基于状态空间模型的3D生物医学图像分割、分类和地标检测

摘要 本文提出了一种基于状态空间模型&#xff08;SSMs&#xff09;的创新架构——nnMamba&#xff0c;用于解决3D生物医学图像分割、分类及地标检测任务中的长距离依赖建模难题。nnMamba结合了卷积神经网络&#xff08;CNN&#xff09;的局部特征提取能力与SSMs的全局上下文建…

探索在生成扩散模型中基于RAG增强生成的实现与未来

概述 像 Stable Diffusion、Flux 这样的生成扩散模型&#xff0c;以及 Hunyuan 等视频模型&#xff0c;都依赖于在单一、资源密集型的训练过程中通过固定数据集获取的知识。任何在训练之后引入的概念——被称为 知识截止——除非通过 微调 或外部适应技术&#xff08;如 低秩适…

OpenAI API模型ChatGPT各模型功能对比,o1、o1Pro、GPT-4o、GPT-4.5调用次数限制附ChatGPT订阅教程

本文包含OpenAI API模型对比页面以及ChatGPT各模型功能对比表 - 截至2025最新整理数据&#xff1a;包含模型分类及描述&#xff1b;调用次数限制&#xff1b; 包含模型的类型有&#xff1a; Chat 模型&#xff08;如 GPT-4o、GPT-4.5、GPT-4&#xff09;专注于对话&#xff0c…