每日编程一刷之删除数组元素(暴力解法+双指针)(leetcode27)
文章目录
前言
题目链接及描述
27. 移除元素 - 力扣(LeetCode) (leetcode-cn.com)
描述
暴力解法
其实这道题目 只要我们将数组里面的元素进行覆盖的话 其实难度就不大,只要是遇到我们想要删除的元素,我们直接将后面的元素直接平移到前一位就行。
下面代码演示
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
for (int i = 0; i < size; i++) {
if (nums[i] == val) { // 发现需要移除的元素,就将数组集体向前移动一位
for (int j = i + 1; j < size; j++) {
nums[j - 1] = nums[j];
}
i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
size--; // 此时数组的大小-1
}
}
return size;
}
};
时间复杂度为o(n^2)
但是有没有更好的解法
双指针解法
这个 其实也不能算是双指针 只不过是指向数组的下标而已
我们这样去思考
将时间复杂度将为n
首先,我们将两个指针同时指向,数组的第一个元素,然后往后进行判断,只要不是我们想删除的元素,我们就继续往下递增(注意是同时往下递增),如果正好遇到我们要删除的元素
手写思路
代码演示
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow=0;
int fast=0;
for(fast=0;fast<nums.size();fast++){
if(val!=nums[fast]){
nums[slow++]=nums[fast];
}
}
return slow;
}
};
结语
今日打卡完成!! 继续加油啦!