移除元素就没啥可说的了,主要是双指针法的使用
27
int removeElement(vector<int>& nums, int val) {
int n=nums.size();
int slowptr=0;
for(int fastptr=0;fastptr<n;fastptr++)
{
//遇到不等于val的元素,就说明数组的大小应该+1了
//用slowptr来表示数组大小
if(nums[fastptr]!=val)
{
nums[slowptr]=nums[fastptr];
slowptr++;
}
//如果等于val,就只是fastptr向后移动
}
return slowptr;
}
26
和上一题差不多,如果要移除相同的元素,那么就检验他是否和上一个元素相同,如果不等于就进行逻辑
int removeDuplicates(vector<int>& nums) {
int n=nums.size();
int slowptr=1;
if(n==0)
{
return 0;
}
for(int fastptr=1;fastptr<nums.size();fastptr++)
{
if(nums[fastptr]!=nums[fastptr-1])
{
nums[slowptr]=nums[fastptr];
slowptr++;
}
}
return slowptr;
}
80
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
int removeDuplicates(vector<int>& nums) {
int n=nums.size();
//显然2以下不可能重复出现2次,所以直接返回
if(n<=2)
{
return n;
}
int slowptr=2;
for(int fastptr=2;fastptr<n;fastptr++)
{
//问题出现在这里,这里是检查slowptr-2是否和fastptr的相等,而不是fastptr-2
if(nums[fastptr]!=nums[slowptr-2])
{
nums[slowptr]=nums[fastptr];
slowptr++;
}
}
return slowptr;
}
283
void moveZeroes(vector<int>& nums) {
int n=nums.size();
int slowptr=0;
for(int fastptr=0;fastptr<n;fastptr++)
{
if(nums[fastptr]!=0)
{
nums[slowptr]=nums[fastptr];
slowptr++;
}
}
for(int i=slowptr;i<n;i++)
{
nums[i]=0;
}
}
977
vector<int> ans(nums.size());
int start=0;
int end=nums.size()-1;
int ptr=end;
while(start<=end)
{
if(abs(nums[start])>abs(nums[end]))
{
ans[ptr]=nums[start]*nums[start];
start++;
}
else
{
ans[ptr]=nums[end]*nums[end];
end--;
}
ptr--;
}
return ans;
}