LeetCode刷题日志:一

LeetCode-27-移除元素设计文档

题目地址

27. 移除元素 - 力扣(LeetCode)

题目解析

  • 本题要求只能使用O(1)的空间,因此不可以开辟新的空间取出保留值,但是题目允许移除元素后整体顺序改变,因此可以考虑将后面的元素用来覆盖前面要消除的值

算法说明

  1. 新建索引pre指向表中第一个数据,新建索引back指向表中最后一个数据

  2. pre从前向后遍历,back从后向前遍历

  3. pre遇到正常元素向后迭代,back遇到异常元素或者pre遇到异常元素后向前迭代,总长减1

  4. 当pre等于back结束迭代

代码实现

// int removeElement(vector<int>& nums, int val) 中
int len = nums.size();
int pre = 0;                                // 前索引
int back = len-1;                           // 后索引
if(len != 0){
    while(true){
        if(pre == back){
            // 结束条件,做一下对比
            if(nums[back] == val){
                // pre和back指向的数据都是val时,长度应该是不包含back位点的
                len = back;
            }else{
                // pre和back指向的数据都不是val时,长度应该是包含back位点的
                len = back+1;
            }
            break;
        }
        while( pre < back && nums[back] == val){
            // 注意:依照逻辑和表达式的截断特征必须将pre < back 放在前边防止back等于-1时溢出
            back--;                             // 从后向前找到非异常数据项
        }
​
        if(pre < back){
            if(nums[pre] == val){
                nums[pre] = nums[back];         // 用后面的非异常数据交换前面的异常数据
                nums[back] = val;
                pre++;
            }else{
                pre++;                          // 未遇到异常数据向后迭代
            }
        }
    }
}
return len;
​

结果

 

总结

  • 提交的时候还是过于着急了,有一些边界问题条件没有处理,提交了五次才通过,因此还是尽量在本地考虑清楚边界问题

  • 本题解在时间复杂度上还是小有成就,不过内存上还是显得有些劣势,如果大家有什么更好的办法减小内存消耗欢迎在评论区交流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学艺不精的Антон

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值