【算法挨揍日记】day01——双指针算法_移动零、 复写零

简介: 题目:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。

283.移动零

题目:

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

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

解题思路:

我们可以利用两个指针(dest和cur)的方法,将这个数组分为三个区域

我们可以将dest初始化为-1,cur初始化为0

cur走一遍数组遇到的两种情况:

  • cur位置为0
  • cur位置为非0

当cur位置为0,cur++;

当cur不为0时,swap交换一下就好,dest++;

解题代码:

class Solution {
public:
void moveZeroes(vector<int>& nums) {
int dest=-1;
int cur=0;
int size=nums.size();
while(cur<size)
            {
if(nums[cur]!=0)
                 {
swap(nums[dest+1],nums[cur]);
                     ++dest;
                }
                ++cur;
            }
    }
};

1089. 复写零

题目:

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

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

解题思路:

本题要求我们要就地修改,不能使用额外的数组,我们先用额外的数组想一想

我们发现结果是这样的

我们再将使用额外数组的双指针方法用在本地去实验一下,我们发现dest=-1和cur=0,去正向解决问题不可以,会有元素被覆盖丢失的问题!

我们试着反向去操作呢,dest=size-1(指向最后一个元素),那我们如何确定cur的位置呢?

我们可以再利用一次双指针的方法来确认cur的位置,一开始cur=0,dest=-1

遍历数组,当cur遇到0时,dest+=2;当cur遇到非0时,cur++;

这里会有一种边界情况需要我们去考虑:

示例:1 0 2 3 0

我们通过上述方式来确定cur时,会出现以下这种情况:

会出现dest越界的情况,我们考科一让size-1的位置置为0,然后cur--,dest-=2这样就可以解决问题了

然后从后向前遇到0就是置两次0,遇到非0就是复制咯,这一步简单

解题代码:

class Solution {
public:
void duplicateZeros(vector<int>& arr) {
int dest=-1;
int cur=0;
int size=arr.size();
//确认cur的位置
while(cur<size)
        {
if(arr[cur]==0)dest+=2;
else dest++;
if(dest>=size-1)break;
           cur++;
        }
//边界情况,示例:1 0 2 3 0,当dest的位置越界了
if(dest==size)
        {
            arr[size-1]=0;
            dest-=2;
           cur--;
        }
while(cur>=0)
        {
if(arr[cur]!=0)
           {
               arr[dest--]=arr[cur--];
           }
else
            {
                arr[dest--]=0;
               arr[dest--]=0;
                cur--;
           }
        }
     }
};


相关文章
|
2月前
|
算法
双指针算法
双指针算法
18 2
|
5天前
|
算法 容器
【算法】双指针
【算法】双指针
|
6天前
|
算法 C++ 容器
【C++算法】双指针
【C++算法】双指针
|
2月前
|
算法
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
|
2月前
|
算法 容器
【经典LeetCode算法题目专栏分类】【第1期】左右双指针系列:盛最多水的容器、接雨水、回文子串、三数之和
【经典LeetCode算法题目专栏分类】【第1期】左右双指针系列:盛最多水的容器、接雨水、回文子串、三数之和
|
6天前
|
算法
基于模糊控制算法的倒立摆控制系统matlab仿真
本项目构建了一个基于模糊控制算法的倒立摆控制系统,利用MATLAB 2022a实现了从不稳定到稳定状态的转变,并输出了相应的动画和收敛过程。模糊控制器通过对小车位置与摆的角度误差及其变化量进行模糊化处理,依据预设的模糊规则库进行模糊推理并最终去模糊化为精确的控制量,成功地使倒立摆维持在直立位置。该方法无需精确数学模型,适用于处理系统的非线性和不确定性。
基于模糊控制算法的倒立摆控制系统matlab仿真
|
5天前
|
机器学习/深度学习 算法 定位技术
MATLAB - 遗传算法(GA)求解旅行商问题(TSP)
MATLAB - 遗传算法(GA)求解旅行商问题(TSP)
12 3
|
7天前
|
算法
基于多路径路由的全局感知网络流量分配优化算法matlab仿真
本文提出一种全局感知网络流量分配优化算法,针对现代网络中多路径路由的需求,旨在均衡分配流量、减轻拥塞并提升吞吐量。算法基于网络模型G(N, M),包含N节点与M连接,并考虑K种不同优先级的流量。通过迭代调整每种流量在各路径上的分配比例,依据带宽利用率um=Σ(xm,k * dk) / cm来优化网络性能,确保高优先级流量的有效传输同时最大化利用网络资源。算法设定收敛条件以避免陷入局部最优解。
|
1月前
|
传感器 算法
基于无线传感器网络的MCKP-MMF算法matlab仿真
MCKP-MMF算法是一种启发式流量估计方法,用于寻找无线传感器网络的局部最优解。它从最小配置开始,逐步优化部分解,调整访问点的状态。算法处理访问点的动态影响半径,根据带宽需求调整,以避免拥塞。在MATLAB 2022a中进行了仿真,显示了访问点半径请求变化和代价函数随时间的演变。算法分两阶段:慢启动阶段识别瓶颈并重设半径,随后进入周期性调整阶段,追求最大最小公平性。
基于无线传感器网络的MCKP-MMF算法matlab仿真
|
17天前
|
算法 5G vr&ar
基于1bitDAC的MU-MIMO的非线性预编码算法matlab性能仿真
在现代无线通信中,1-bit DAC的非线性预编码技术应用于MU-MIMO系统,旨在降低成本与能耗。本文采用MATLAB 2022a版本,深入探讨此技术,并通过算法运行效果图展示性能。核心代码支持中文注释与操作指导。理论部分包括信号量化、符号最大化准则,并对比ZF、WF、MRT及ADMM等算法,揭示了在1-bit量化条件下如何优化预编码以提升系统性能。