27. 移除元素
题目大意:
给一个数组,以及一个val,在保证空间复杂度为O(1)的基础上移除值为val的元素,并返回新数组的长度。
思路:
因为要保证空间复杂度为O(1),所以不能新建数组,所以利用双指针,一个指向头,一个指向尾,头指针用来判断当前指向的值是否等于val,尾指针指向的位置用来存放接收的val值(实际不用接收,只需要把尾指针指向的元素赋给 值为val的头指针位置即可。
题解:
/*==================================
这个方法的缺陷就是 不稳定
保留的数字的相对顺序改变了
===================================*/
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
if(nums.size() == 0)
return 0;
int i = 0, j = nums.size()-1;
while(i != j)
{
if(nums[i] == val){
nums[i] = nums[j];
--j;
}
else
{
++i;
}
}
if(nums[i] == val)
return i;
else
return i+1;
}
};
283. 移动零
题目大意:
将0元素移动到数组的尾部, 同时保证 其余非0元素的相对位置不变,所以不能用上面的方法。
思路:
同样还是双指针,思路跟上面的27差不多,只不过这个两个指针都是从头开始。
题解:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int fast = 0, slow = 0;
int length = nums.size();
while(fast < length)
{
if(nums[fast] != 0)
{
nums[slow++] = nums[fast++];
}
else
{
++fast;
}
}
for(int i = slow; i < length; ++i)
nums[i] = 0;
}
};
待做:
26、844、977