目录
力扣题址:
1.数组中删除重复项
这道题题目关键在“有序”二字,有序意味着重复元素一定是相邻的,利用这一特点,我们可以使用双指针的方法删除重复元素。
思路:
设置两个指针,fast和slow,fast[i]与fast[i-1]比较,不等r则赋值到slow所指的位置,接着fast++,最后返回slow即可。
如果数组 nums 的长度为 0,则数组不包含任何元素,因此返回 0。
当数组 nums 的长度大于 0 时,数组中至少包含一个元素,在删除重复元素之后也至少剩下一个元素,因此 nums[0] 保持原状即可,从下标 1 开始删除重复元素。
代码:
java:
class Solution {
public int removeDuplicates(int[] nums) {
int k=1;
if (nums.length == 0) {
return 0;
}
for(int i=1;i<nums.length;i++){
if(nums[i]!=nums[i-1]){
nums[k++]=nums[i];
}
}
return (k);
}
}
C++:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n = nums.size();
if (n == 0) {
return 0;
}
int fast = 1, slow = 1;
while (fast < n) {
if (nums[fast] != nums[fast - 1]) {
nums[slow] = nums[fast];
++slow;
}
++fast; //这里不能作为else部分,它的作用是使循环能够继续,只能在后面
}
return slow;
}
};
优化:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n = nums.size();
if (n == 0) {
return 0;
}
for ( int fast = 1, slow = 1;fast < n ;++fast) {
if (nums[fast] != nums[fast - 1]) {
nums[slow] = nums[fast];
++slow;
}
}
return slow;
}
};
力扣题址:
2.移除有关元素
题目要求原地改数组,并返回改后数组,可以用双指针法
思路:
设置两个指针,right和left,从0开始遍历,当right遍历到不等于val值时,赋值给left,否则跳到下一位,然后返回left即可。
代码:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
int left = 0;
for (int right = 0; right < n; right++) {
if (nums[right] != val) {
nums[left] = nums[right];
left++;
}
}
return left;
}
};
优化思路:
上面方法有个缺点,就是当val值在前面时,就需要左移后面的全部元素,比较繁琐。
这里要注意一下题目说“元素的顺序可以改变”。
因此,我们可以将left从0开始,right从nums.length开始,重复上述操作,直至left与right重合。优化后的方法避免了需要保留元素的重复赋值操作,但是这个方法,主要在val值较少时比较有效。
代码:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int left = 0, right = nums.size();
while (left < right) {
if (nums[left] == val) {
nums[left] = nums[right - 1];
right--;
} else {
left++;
}
}
return left;
}
};
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝 int len = removeElement(nums, val); // 在函数里修改输入数组对于调用者是可见的。 // 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。 for (int i = 0; i < len; i++) { print(nums[i]); }