直接模拟 采用覆盖的方式去删除重复项 很浪费时间和空间
class Solution {
public int removeDuplicates(int[] nums) {
int k = nums.length;
int p1 = 0;
int p2 = nums.length - 1;
while(p1 < p2 && p1 != k -1){
if(nums[p1] == nums[p1+1]){
for(int i = p1;i < p2;i++){
nums[i] = nums[i+1];
}
k--;
}else{
p1++;
}
}
return k;
}
}
虽然过了 但还不够
优化算法
思路:采用计算重复个数 去移动第一个指针的位置 第二个指针用于去判断有几个重复遍历数组
- int p = 0;:这个变量 p 是一个指针,用来指示唯一元素应该放置的位置。在循环过程中,它会逐步指向新数组的末尾。
- int p1 = 0;:这是第一个指针,用于遍历原始数组。它从数组的开头开始。
- while (p1 < nums.length):这是一个循环,它确保我们在数组范围内进行操作,不会发生数组越界的情况。
- int p2 = p1 + 1;:这是第二个指针,用于查找连续重复的元素。它从第一个指针指向的元素的下一个位置开始。
- while (p2 < nums.length && nums[p1] == nums[p2]):这是一个内部循环,它会在找到连续重复的元素时进行迭代。当第二个指针 p2 指向的元素与第一个指针 p1 指向的元素相同时,就会继续向后移动。
- nums[p] = nums[p1];:当找到非重复的元素时,将它放置到唯一元素应该放置的位置 p。
- p++;:将唯一元素的指针向后移动一个位置,为下一个唯一元素做准备。
- p1 = p2;:将第一个指针移动到下一个非重复元素的位置,以继续遍历数组。
- 最后,返回 p,即唯一元素的数量,也就是新数组的长度。
class Solution {
public int removeDuplicates(int[] nums) {
int p = 0; // 指示唯一元素应该放置的位置
int p1 = 0; // 第一个指针,用于遍历数组
while (p1 < nums.length) { // 循环遍历数组
int p2 = p1 + 1; // 第二个指针,用于查找连续重复的元素
while (p2 < nums.length && nums[p1] == nums[p2]) { // 找到连续重复的元素
p2++; // 移动第二个指针
}
nums[p] = nums[p1]; // 将当前非重复的元素放置到唯一元素的位置
p++; // 移动唯一元素的指针
p1 = p2; // 更新第一个指针到下一个非重复元素的位置
}
return p; // 返回唯一元素的数量
}
}
差不多 可以接受