力扣题号:27 移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
方法1:暴力破解
#include<bits/stdc++.h>
using namespace std;
//暴力破解法
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--;
size--;
}
}
return size;
}
};
int main(){
vector<int> nums;
int val;
int a;
cout<<"输入数组:"<<endl;
while(cin>>a){
nums.push_back(a);
char c = cin.get();
if(c=='\n'){
break;
}
}
cout<<"输入移除数:"<<endl;
cin>>val;
Solution S1;
int size=S1.removeElement(nums,val);
cout<<"移除后数组长度为:"<<size<<endl;
system("pause");
return 0;
}
注意点:
二重循环提里j=i+1
i--和size--容易遗忘,需谨记
时间复杂度:O(n2)
空间复杂度:O(1)
方法2:双指针法(快慢指针法)
#include<bits/stdc++.h>
using namespace std;
//双指针法
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;
}
};
int main(){
vector<int> nums;
int val;
int a;
cout<<"输入数组:"<<endl;
while(cin>>a){
nums.push_back(a);
char c=cin.get();
if(c=='\n'){
break;
}
}
cout<<"输入移除数:"<<endl;
cin>>val;
Solution S1;
int size = S1.removeElement(nums,val);
cout<<"移除后数组长度为:"<<size<<endl;
system("pause");
return 0;
}
时间复杂度:O(n)
空间复杂度:O(1)
注:
双指针很常用