优选算法之技巧(一):双指针一:移位0与复写0

引用:我们之前学过快排,首先用三元取中,找(key),然后就用到了双指针的方法来进行交换排序,那我们今天要讲的双指针其实大同小异,无非在数组中就变成了下标。

题一:

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

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

题一思路:

current起到遍历作用,从左向右,起始位置在第一个元素,即下标0;

desteration是指最后一个非0元素,起始位置在第一个元素前一个,即下表-1;

当current当前是非0元素,即desteration++,然后让current与desteration所指向的原素进行交换,current++

当current当前是0元素,即current++;

当current遍历完,则结束循环,输出结果!

思路图如下:

题一思路代码:

class Solution {

public:

void moveZeroes(vector<int>& nums) {

int current=0;

int desteration=-1;

int size=nums.size();

while(current!=size)

{

if(numscurrent!=0)

{

desteration++;

swap(numscurrent,numsdesteration);

current++;

}

else

{

current++;

}

}

}

};

题二:

给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地进行上述修改,不要从函数返回任何东西。

题二思路:

我们如果从前往后进行操作的话,会出现desteration在current之后,所以我们要从后往前操作,故我们要找出最后一个current的位置,desteration为最后一个位置刚好为最后一个元素。

但是如果最后一个current指向的元素为0,那desteration会超出数组范围,也就是越界。

故这作为一种特殊情况处理。如图:

常规:

一,找最后一个current步骤:1,判断当前current的值。2,让desteration进行向后移动一步或二步。3,判断desteration是否到最后。4,current++;

(特殊情况)n-1=0,current--,desteration-=2;

二,进行逆"复写"。

题二思路代码:

class Solution {

public:

void duplicateZeros(vector<int>& arr) {

int desteration=-1;

int current=0;

while(current<arr.size())

{

if(arrcurrent!=0)

{

desteration++;

}

else{

desteration+=2;

}

if(desteration>=arr.size()-1)

{

break;

}

current++;

}

if(desteration==arr.size())

{

current--;

arrarr.size()-1=0;

desteration-=2;

}

//逆复写

while(current>=0)

{

if(arrcurrent!=0)

{

arrdesteration--=arrcurrent--;

}

else{

arrdesteration--=0;

arrdesteration--=0;

current--;

}

}

}

};

让我们相遇在下一篇算法讲解!

相关推荐
岑梓铭11 分钟前
《考研408数据结构》第八章(排序)复习笔记
数据结构·笔记
青少儿编程课堂26 分钟前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
在所不辞兄1 小时前
为什么在新能源汽车电驱与热管理开发中,AI驱动的数字孪生和数据驱动仿真正在部分替代对物理台架与实车标定的依赖?
人工智能·深度学习·神经网络·算法·机器学习
I_belong_to_jesus11 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Code_Solitude18 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司18 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
YLCHUP21 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
思麟呀21 小时前
背包DP(01背包+完全背包)
c++·算法
笑容掩饰我的失落1 天前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法