LeetCode-27-移除元素设计文档
题目地址
题目解析
-
本题要求只能使用O(1)的空间,因此不可以开辟新的空间取出保留值,但是题目允许移除元素后整体顺序改变,因此可以考虑将后面的元素用来覆盖前面要消除的值
算法说明
-
新建索引pre指向表中第一个数据,新建索引back指向表中最后一个数据
-
pre从前向后遍历,back从后向前遍历
-
pre遇到正常元素向后迭代,back遇到异常元素或者pre遇到异常元素后向前迭代,总长减1
-
当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;
结果
总结
-
提交的时候还是过于着急了,有一些边界问题条件没有处理,提交了五次才通过,因此还是尽量在本地考虑清楚边界问题
-
本题解在时间复杂度上还是小有成就,不过内存上还是显得有些劣势,如果大家有什么更好的办法减小内存消耗欢迎在评论区交流