题目1:https://leetcode.cn/problems/move-zeroes

小编刚看到这道题的时候,想到的第一个方法就是建立一个与原数组等大的新的数组,然后遍历原数组,如果遇到元素值不为0的元素,就将这个元素放到新数组中,直到遍历完整个数组,那么当遍历完整个数组以后,新数组的剩余位置就应该都存放0,直接通过循环存放0即可,最后将新数组中的元素依次赋值给原数组即可。

但是,题目要求,必须在不复制数组的情况下对数组进行原地操作。

这要咋办?

还是请出我们的老朋友——双指针法,看利用它是否能解决这道问题。

我们可以这么想,这道题的本质无非就是实现数组的分块,以某一个位置为界限,这个位置左边的元素都是不为0的,右边的元素都等于0.

那我们就可以这样操作:设定一个界限dest,然后通过算法使得dest左边的元素都是不为0的。

现在我们来考虑实现这个算法:定义一个整形指针pcur来遍历数组,初始pcur指向0;而刚开始的时候dest所包含的区域中肯定是一个元素都没有的,所以我们可以将它初始化为-1。

进行一下操作:如果pcur指向的元素不等于0,那就让dest先往前走一步,然后再让dest位置的元素赋值为pcur所指向的元素,如果pcur指向的元素等于0,那直接让pcur往前走一步即可。

这样一来,pcur越界以后,dest之前的元素都是不为0的元素,我们只需要再将dest之后的元素通过循环都变成0即可。

void moveZeroes(int* nums, int numsSize)
{//双指针,定义prev和pcur指针//pcur指向的元素如果不等于0,就让prev指向的位置的值等于pcur指向位置的值,prev往前走,pcur也往前走,反之,prev不动,pcur往前走int pcur = 0, prev = -1;while (pcur < numsSize){if (nums[pcur] != 0){nums[++prev] = nums[pcur];pcur++;}else {pcur++;}}for (int i = prev+1; i < numsSize; i++){nums[i] = 0;}}

我们来画图演示一下这个过程:

上面的思路中我们分别用了两次循环才实现代码,有没有更简洁的方法呢?能不能一次就搞定啊?

包有的,现在我们就来看一下:

我们还是让dest初始指向-1,pcur初始指向0,如果pcur指向的元素不为0,那就先让dest往前走一步,然后交换dest和pcur所指向的元素,反之,直接让pcur往前走一步,到了最后pcur越界,此时就已经将数组变成预期的效果了

void moveZeroes(int* nums, int numsSize)
{int pcur=0,dest=-1;while(pcur<numsSize){if(nums[pcur]){dest++;int tmp=nums[dest];nums[dest]=nums[pcur];nums[pcur]=tmp;}pcur++;}
}

题目2:https://leetcode.cn/problems/duplicate-zeros

这道题就有点意思了,虽然这道题的难度设置是简单,但他的整体思路还是比较难想的。

如果我们异地修改整个数组,即创建一个新的数组来完成任务,那这道题就非常简单,但是这道题要求不能使用这个方法。

小编就不卖关子了,直接给出这道题的整体思路。

以上面的实例1为例,我们呢来讲解一下这道题的整体思路。

我们可以根据输出结果看到数组中要保留的最后一个元素是4,我们可以定义一个整形指针pcur指向要保留的最后一个数据,再定义一个整形指针dest指向数组中的最后一个位置,执行以下操作"

1.根据pcur指向的元素的值判断dest应该向前走多少步:

  • 如果pcur指向的值是0,那么就进行两次这个操作:让dest指向的位置的值赋值为0,同时让dest往前走一步;之后还要再让pcur往前走一步
  • 如果pcur指向非0值x,那么就进行以下操作:让dest指向的位置的值赋值为x,同时让dest和pcur往前走一步

如以下示意图:

可以看到,这种算法确实可以帮我们完成任务,但是现在的问题就转换为我们如何写一个算法能够得到最后一个要保留的元素的值。

这个方法比较难想到,我们直接给出算法:

定义两个指针pcur和dest,pcur初始指向0,dest指向-1,执行以下操作:

1.如果pcur指向的值为非0值,就让dest往前走一步;判断dest是否越界(dest>=numssize-1),如果dest越界,那么就直接结束遍历,如果没有越界,就让pcur往前走一步

2.如果pcur指向的值等于0,就让dest往前走两步,判断dest是否越界(dest>=numssize-1),如果dest越界,那么就直接结束遍历,如果没有越界,就让pcur往前走一步

当dest越界的时候,pcur指向的位置就是我们要找的位置。

我们可以画图来验证一下:

可以看到,通过以上算法步骤,pcur最终指向的位置确实就是我们要保留的最后一个数据。

但是,还有一个需要考虑的特殊情况,如以下案例:

我们可以发现,在上面的例子中,dest超过了数组可以表示的范围,其实原因就是最后一个要保留的数据是0,所以dest要走两步发生越界,这种情况下,我们需要进行特殊处理:

直接让数组下标为n-1的位置的值等于0,然后让pcur往前走一步,dest往前走两步即可:

我们结合上面的思路来写一下代码:

void duplicateZeros(int* arr, int arrSize) 
{int n=arrSize;//先找到数组中最后一个要保留的数据的位置int pcur=0,dest=-1;while(pcur<n){if(arr[pcur])dest++;elsedest+=2;if(dest>=n-1)break;pcur++;} //进行特殊处理if(dest>n-1){arr[n-1]=0;dest-=2;pcur--;}  //进行元素的复写while(pcur>=0){if(arr[pcur]){arr[dest--]=arr[pcur--];}else{arr[dest--]=0;arr[dest--]=0;pcur--;}}
}

小结:这一小节我们主要通过两个算法题对应用双指针的解题思路进行了讲解,小编认为第二道题还是比较有难度的。小伙伴们一定要自己在草稿纸或者电脑上多画一下图,理解算法的思想。

欢迎小伙伴们在评论区提出问题和讨论!!!

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

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

相关文章

告别单次对话:上下文工程如何重塑AI应用架构

1. 前言人工智能应用开发领域正在经历一场静悄悄的变革。去年此时&#xff0c;提示工程&#xff08;Prompt Engineering&#xff09;还是各大技术论坛的热门话题&#xff0c;开发者们热衷于分享各种精心设计的提示词模板&#xff0c;试图通过单次交互获得理想的大模型输出。然而…

PM2 管理后端(设置项目自启动)

查看pm2管理pm2 list ┌────┬──────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──…

CCN中商再获三项知识产权,为数字化服务添动能

上海中商网络股份有限公司&#xff08;CCN中商&#xff09;依托持续的研发投入与深厚的技术积淀&#xff0c;在知识产权领域再获重要突破——成功收获三项知识产权&#xff0c;囊括实用新型专利《一种3D霓彩智感双条光柱印刷用全自动生产线》、发明专利《一种一物一码关联系统及…

使用LTspice仿真一个异步BUCK电路

确定异步BUCK的规格 输入电压&#xff08;Vin&#xff09;&#xff1a;12V 输出电压&#xff08;Vout&#xff09;&#xff1a;6V 最大输出电流&#xff08;Iout&#xff09;&#xff1a;3A 开关频率&#xff08;fsw&#xff09;&#xff1a;400kHz 输出电压纹波&#xff08;Δ…

R语言对excel中多个sheet子表批量进行地理探测器计算

## 基本设置 ## 1) 设定你的工作目录&#xff08;保持你的原路径不变&#xff09; setwd("D:/*****/*****/******")## 2) 文件名&#xff08;与xlsx实际名字保持一致&#xff09; xlsx_file <- "驱动因素&#xff08;中低收入&#xff09;.xlsx"## 依…

C++ JSON 数据库:jsoncpp

jsoncpp1. JSON数据1.1 JSON 的基本语法规则1. 基础语法要求两种核心数据结构JSON 与其他数据格式的对比1.2 JSON 的典型应用场景1.3 JSON 解析与生成工具2. 编程语言库&#xff08;解析/生成&#xff09;1.4 常见错误与注意事项2. jsoncpp2.1 基本用法1. 安装与集成2. 核心类与…

《苍穹外卖》项目日记_Day9

前言&#xff1a; 上午就把今天任务完成了&#xff0c;就继续往后学了一些知识&#xff0c;晚上写下笔记总结一下。 今日完成任务&#xff1a; 调用百度地图开放平台&#xff0c;优化用户下单业务学习SpringTask&#xff0c;定时处理超时、派送中订单学习WebSocket&#xff0c;…

人工智能学习:Transformer结构中的编码器层(Encoder Layer)

Transformer结构中的编码器层(Encoder Layer) 一、编码器层介绍 概念 编码器层(Encoder Layer)是Transformer编码器的基本构建单元,它重复堆叠形成整个编码器,负责逐步提取输入序列的特征。每个编码器层由两个核心子层组成: 多头自注意力机制(Multi-Head Self-Attentio…

2018年下半年 系统架构设计师 综合知识

1.在磁盘调度管理中&#xff0c;应先进行移臂调度&#xff0c;再进行旋转调度。假设磁盘移动臂位于21 号柱面上&#xff0c;进程的请求序列如下表所示。如果采用最短移臂调度算法&#xff0c;那么系统的响应 序列应为(D )。A. ②⑧③④⑤①⑦⑥⑨ …

数据库的连接_qt

数据库的连接形式可以通过cmd查看 1.获取 UI 输入的连接参数 // 获取主机名&#xff08;如"localhost"或IP地址&#xff09; QString hostStr hostEdit->text(); // 从hostEdit控件获取文本 QByteArray hostBa hostStr.toUtf8(); // 转换为UTF-8编码的字节数…

HTML 设计与使用入门

HTML 设计与使用入门 一、完整示例&#xff08;基础页面模板&#xff09;这是一个结构清晰、可直接拷贝运行的最小 HTML 模板&#xff1a;<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"utf-8"><meta name"vie…

Gradio全解11——Streaming:流式传输的视频应用(2)——Twilio:网络服务提供商

Gradio全解11——Streaming&#xff1a;流式传输的视频应用&#xff08;2&#xff09;——Twilio&#xff1a;网络服务提供商11.2 Twilio&#xff1a;网络服务提供商11.2.1 Twillo穿透服务与TURN服务器1. 什么是STUN、TURN和ICE&#xff1f;2. Twilio介绍及网络穿透服务3. Twil…

【更新至2024年】2009-2024年各地级市金融科技水平数据

【更新至2024年】2009-2024年各地级市金融科技水平数据 1、时间&#xff1a;2009-2024年 2、来源&#xff1a;天眼查 3、指标&#xff1a;年份、省份、地级市、地级市代码、当年新注册金融科技公司数量、累计注册金融科技公司数量、金融科技水平 4、范围&#xff1a;地级市…

一般软件加载显示图片的流程

目录 1、一般图片浏览软件的流程&#xff08;Qt 或类似框架&#xff09;&#xff1a; 1️⃣ 读取原始数据 2️⃣ 解析图片格式 3️⃣ 存储到内部可用的绘制对象 4️⃣ 显示到界面 ✅ 总结 2、那什么叫“QPixmap 在 Qt 里就是“显示专用的像素缓存”&#xff0c;不是原始…

【论文阅读】REFRAG:一个提升RAG解码效率的新思路

引言 看到一则报道[1]&#xff0c;重组后的Meta实验室在9月1号发布了一篇关于提升RAG解码效率的论文&#xff0c;提出的思路有点启发作用&#xff0c;于是把原文下载下来仔细看下。 论文标题&#xff1a;REFRAG: Rethinking RAG based Decoding 论文地址&#xff1a;https://ar…

QT M/V架构开发实战:QFileSystemModel介绍

目录[TOC](目录)前言一、QFileSystemModel初步介绍二、基本功能1.创建2.基本属性与方法三、示例&#xff08;简单的文件浏览器&#xff09;四、性能注意事项前言 本文主要介绍的是使用代码生成的情况下对控件的介绍&#xff0c;包括拥有的功能及能修改的样式&#xff0c;也会说…

视频生成迎来效率革命!字节提出视频生成稀疏注意力机制,计算量降20倍,速度升17.79倍!

论文链接&#xff1a;https://arxiv.org/pdf/2509.01085亮点直击BSA——一种可训练的双向动态稀疏注意力框架&#xff0c;该框架首次在视频扩散训练中对全注意力机制中的查询&#xff08;Query&#xff09;及键值对&#xff08;Key-Value&#xff09;进行正交稀疏化处理以加速训…

STM32HAL库_cubeMX

ADC简介STM32f103的是12位逼近型ADC代码连续非扫描模式&#xff08;1个通道&#xff09;1&#xff1a;校准ADC&#xff08;这个可要可不要&#xff09;2&#xff1a;ADC初始化3&#xff1a;配置ADC通道&#xff08;这个函数只有一个通道时就是可要可不要&#xff09;4&#xff…

【Qt】清空QDateTimeEdit

代码 ui->startDate->setSpecialValueText(" "); //这里是空格 ui->startDate->setMinimumDate(QDate(2024, 1, 1)); ui->startDate->setDate(QDate::fromString("2024-01-01", "yyyy-MM-dd"));原理 设置特殊值显示文本&#…

LiTS 2017 datasets

下载记录 论文地址&#xff1a;https://doi.org/10.1016/j.media.2022.102680 官方下载链接&#xff1a;https://competitions.codalab.org/competitions/17094 进入链接后&#xff0c;需要先注册才能拿到下载点击Train data下面的Mirro1&#xff0c;在google云盘会看到Trai…