提示:以下是本篇文章正文内容,下面案例可供参考
1.自己的暴力解法
class Solution
{
public:
int removeElement(vector<int>& nums, int val)
{
int size = nums.size();
for (int i = 0; i < size; ++i)
while (nums[i] == val)
{
if (i == size - 1)
{
--size;
break;
}
for (int j = i; j < size - 1; ++j) nums[j] = nums[j + 1];
--size;
}
return size;
}
};
2.自己的进阶解法
不会。
3.自己的库函数解法
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
vector<int>::iterator it = remove(nums.begin(), nums.end(), val);
return (it - nums.begin());
}
};
4.题解的暴力解法
主要思想就是寻找到目标元素,然后将后面的元素整体向前覆盖一位。
// 时间复杂度:O(n^2)
// 空间复杂度:O(1)
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;
}
};
5.题解的进阶解法
双指针法之快慢指针法:快指针寻找并指向不含有目标元素的元素,慢指针指向新数组下标的位置。
// 时间复杂度:O(n)
// 空间复杂度:O(1)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
if (val != nums[fastIndex]) {
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}
};
6.总结
无。