27. 移除元素
解题思路
简单题,使用双指针求解,这里使用头尾指针,把等于val
的扔到数组后边就行。一个指针l
从头开始,另一个指针r
从末尾开始。若前边有等于val
的元素,就与指针r
交换并且指针r
前移,l
指针不动,因为并不知道交换到l
位置上的元素是否等于val
;否则指针l后移继续遍历。
class Solution {
public:
int removeElement(vector<int>& nums, int val)
{
int l=0,r=nums.size()-1;
while(l<=r)
{
if(nums[l]==val)
{
swap(nums[l],nums[r]);
r--;
}
else l++;
}
return l;
}
};
26. 删除有序数组中的重复项
解题思路
简单题,同样使用双指针求解。这道题不需要考虑数组中超出新长度后面的元素。所以只需要快一个指针r
遍历数组,另一个慢指针l
从头开始更新nums
。先保留第1个元素,若后边的元素与当前元素相等,则指针r
后移,否则更新nums
,由于l
是初始值是0,而且nums
是保留第一个元素的,所以更新完之后的l
是新数组的最后一个元素下标,新数组的长度就是l+1
。
class Solution {
public:
int removeDuplicates(vector<int>& nums)
{
int l=0,r=1;
while(r<nums.size())
{
if(nums[l]==nums[r])r++;
else nums[++l]=nums[r];//更新数组
}
return l+1;
}
};
283. 移动零
解题思路
简单题,继续双指针。这道题跟27.移除元素很像,不过这里不是首尾指针。使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。
注意:这道题目要求新数组元素的相对位置是不发生改变的
class Solution {
public:
void moveZeroes(vector<int>& nums)
{
int i=0,j=0;
while(i<nums.size())
{
if(nums[i]!=0)
{
swap(nums[j],nums[i]);
j++;
}
i++;
}
}
};
977. 有序数组的平方
解题思路
简单题,采用双指针求解。如果平方之后不排序,那么数组就是是两头大中间小的,把它变成非递减的,那么只需要在首尾找最大的值,作为新数组的最好一个元素,然后在原数组中缩小范围继续查找。
结合代码更好理解。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums)
{
int n=nums.size();
vector<int>res(n);
int l=0,r=n-1;
while(l<=r)
{
if(abs(nums[l])>abs(nums[r]))res[--n]=nums[l]*nums[l++];//l右移
else res[--n]=nums[r]*nums[r--];//r左移
//l和r的变化就体现了范围的收缩。
}
return res;
}
};