算法学习记录DAY2

题源(力扣平台)

解题原理:

先考虑"异地拷贝数组",进行复写操作。然后考虑从左往右进行原地复写,但是发现这个过程中会覆盖掉未处理却应该处理的数据。于是考虑从右往左进行复写,则分为两步:

1.找到最后一个需要复写的数字

2.从后往前进行复写

cpp 复制代码
class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        //1、找最后一个需要复写的数字---数组下标
        int des = -1 , cur = 0, n = arr.size();
        while(cur < n ){
            if(arr[cur] != 0) des+=1;
            else des+=2;
            if(des >= n - 1) break;
            cur++;
        }
        //我的错解:
        //while(des < n ){
        //  if(arr[cur] != 0) des+=1;
        //  else des+=2;
        //  cur++;
      //}
        cout << cur;
         //2.从后向前进行复写
         //结束条件:cur < 0
         if(des == n){
            arr[n-1] = 0;
            des-=2;cur--;
         }
         while(cur>=0 && des >= 0){
            if(arr[cur] == 0){
                arr[des] = arr[des - 1] = 0;
                des-=2;
            }
            else {
                arr[des] = arr[cur];
                des--;
            }
            cur--;
         }
        // for(int des = -1,cur = 0;des < arr.size();cur++){
        //     if(arr[cur] != 0) des++;
        //     else des+=2;
        //     cout << des;
        // }
       
    }
};

我的出错点:

1.在找最后一个需要复写的元素下标时,没有搞清楚循环结束情况,写成了des > n时结束循环。

这是因为对"双指针算法"的错误理解与思路的不清晰:des是因为cur才有变化的,所以循环主体判断条件应该是cur,而不是des,本末倒置了;des在>n时确实是需要考虑到的边界情况,但是并没有考虑清楚des在越界时的真正含义

2.没考虑到特殊边界情况(最后一个复写元素为0时),以及处理方式不对

由1.能考虑到des>=n-1时,就应该有两种情况。des = n -1;des = n;

而对应的复写操作中,访问了arrdes此时就已经越界,就算考虑不到最后一个复写元素为0的情况,也应该考虑到数组访问的这种边界情况。

总结:

如何能在第一次写的时候就考虑全面?

deepseek给我的建议;

编写算法时的思维习惯

  • 画图:用下标模拟每一步的变化。

  • 考虑极端值:最小长度(1)、全零、零出现在不同位置。

  • 关注索引变化:当增量可能为 2 时,一定要思考"刚好越界"的情况。

相关推荐
海海不掉头发1 分钟前
CSDN博客_时序预测9模型复现对比
人工智能·学习·软件工程
蓝祁子yoky2 小时前
Qt学习日记 Day13:网络编程(一)-TCP基础与Socket实战
网络·qt·学习
架构师伯子明3 小时前
Ros 学习十三:IK Demo
学习
小羊没烦恼!3 小时前
关于分布式锁原理的一些学习与思考-redis分布式锁,zookeeper分布式锁
java·服务器·网络·学习·负载均衡
幼儿园蛋小黄3 小时前
从 STM32N647 的 AI 部署入门嵌入式:一条可落地的学习路线
人工智能·stm32·学习
Y.9995 小时前
电脑黑屏只有鼠标能动
学习
架构师伯子明5 小时前
FFmpeg C++学习(一):编译和demo
开发语言·c++·学习
叼烟扛炮5 小时前
[LangChain] 学习笔记(02):LCEL 链式调用与动态模型配置实战
服务器·开发语言·网络·笔记·学习·langchain
程序员梅雨5 小时前
【从零开始学习数据仓库 | 第二篇】: 拉链表 & 数仓分层
大数据·数据仓库·学习
一木 之林6 小时前
Dify学习笔记 04 · 检索底座:Embedding、Rerank与向量数据库(第46-54集)
笔记·学习·embedding·dify