26.删除有序数组的重复项
题目:给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
注意本题数组已按升序排列,用双指针不仅不用额外的空间,而且不会改变数组元素的相对顺序,注意返回slowIndex + 1。因为删除操作完成后,慢指针指向新数组的最后一个元素。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int slowIndex = 0;
for (int fastIndex = 0; fastIndex != nums.size(); ++fastIndex){
if (nums[fastIndex] != nums[slowIndex]){
nums[slowIndex + 1] = nums[fastIndex];
++slowIndex;
}
}
return slowIndex + 1;
}
};
此外,27题移除元素,283题移动零也类似。
27.移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 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];
++slowIndex;//可以一行nums[slowIndex++] = nums[fastIndex]
}
}
return slowIndex;
}
};
判断条件和返回值与26题有所区别。
283.移动零元素
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例:输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
其实这题也一样,就是判断快指针是否为0,若为0则继续右移,若不为0则交换快慢指针(下标)指向的值。然后因为是void类型函数,所以不用返回值。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int slowIndex = 0;
for (int fastIndex = 0; fastIndex != nums.size(); ++fastIndex){
if(nums[fastIndex] != 0){
swap(nums[slowIndex], nums[fastIndex]);
++slowIndex;
}
}
}
};