每日算法【双指针算法】(Day 2-复写零)

双指针算法

1.算法题目(复写零)

注意:不要越界,不能开额外的数组,只能从现有数组上进行操作,没有返回值。

2.讲解算法原理

解法 :双指针操作

先根据"异地"操作,然后优化成双指针的"就地"操作。

  • 先找到最后一个"复写"的数;
  • 双指针算法
    解释:用一个数组,让cur指向下标为0的位置,让dest指向下标为-1的位置,判断cur指向的元素是否为零,不为零dest向后移动一位,判断dest是否移动到最后一位,没有就再次移动cur一位,如果cur指向的元素为零,就要dest向后移动两位,再判断dest是否结束,结束就知道复写数组最后一个元素是什么。
  • 先判断cur位置的值
  • 决定dest向后移动一步或者两步
  • 判断一下dest是否已经到结束为止
  • cur++
  1. 处理一下边界情况
    因为dest可能存在越界的情况
cpp 复制代码
n-1=0;
cur--;
dest-=2;
  1. "从后向前"完成复写操作;
    因为我们已经知道最后一个元素是什么了,"从后往前"复写也不会存在覆盖的情况。

3.编写代码

cpp 复制代码
class Solution {
public:
    void duplicateZeros(vector<int>& arr) 
    {
        //1.先找最后一个元素
        int cur = 0, dest = -1, n = arr.size();
        while (cur < n)
        {
            if (arr[cur])dest++;
            else dest += 2;
            if (dest >= n - 1)break;
            cur++;
        }
        //2.处理边界问题
        if (dest == n)
        {
            arr[n - 1] = 0;
            cur--; dest -= 2;
        }
        //3.从后向前完成复写
        while (cur >= 0)
        {
            if (arr[cur])arr[dest--] = arr[cur--];
            else
            {
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            }
        }

    }
};
相关推荐
stolentime9 小时前
CSP-J2026第一轮试题(附答案解析、markdown源码)
c++·csp
Rabitebla9 小时前
【Linux系统编程】 指令(二):一条路径是怎么定位到文件的
linux·c++·笔记·学习·算法
库玛西9 小时前
数据结构与算法之美:树、森林与二叉树全解析
c语言·数据结构·笔记·考研·算法·学习方法
木井巳9 小时前
【记忆化搜索】最长递增子序列
java·算法·leetcode·深度优先·剪枝·推荐算法
东方护航数据恢复(深圳)9 小时前
本地小算力设备数据恢复经典案例实操全解_东方护航数据恢复深圳店
大数据·服务器·算法·ai·gpu算力
Omics Pro9 小时前
上海AI Lab孙思琦×高张阳:虚拟细胞代码库智能体
数据库·人工智能·算法·机器学习·自然语言处理
Y幽谷客9 小时前
图像识别入门习题整理
算法
点纭9 小时前
C 语言 第七章 常用函数(3)
c语言·开发语言·算法·oracle·c#
程序员老陆10 小时前
std::experimental::when_any 深度解析:等待“第一个完成”的异步组合原语
c++·多线程
β添砖java10 小时前
机器学习2 KNN算法、距离度量、特征预处理、超参数选择、手写数字、鸢尾花
人工智能·算法·机器学习