删除有序数组中的重复项 I
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
返回 k 。
解题思路:因为题目为升序排列,因此重复元素一定在一起,通过题目分析该题使快慢双指针进行数组遍历,其中i指针进行数组遍历,a指针进行数组修改并输出数组大小
class Solution {
public int removeDuplicates(int[] nums) {
int i,n,a=1;
//a的初值为1表示索引为0的元素一定不会被删除,因此从1开始
n=nums.length;
for(i=0;i<n-1;i++){ //i<n-1防止数组溢出
if(nums[i]!=nums[i+1]){
//如果该元素与该元素后方元素不同,则将该元素后方元素覆盖在输出数组上
nums[a]=nums[i+1];
a++; //数组修改指针后移表示修改完成
}
}
return a; //输出修改后数组长度
}
}
删除有序数组中的重复项 II
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
解题思路如下:
本题难点在于如何保留超过两次的元素,使其变为只出现两次,因此使用计数器count来确定该元素是否重复出现
class Solution {
public int removeDuplicates(int[] nums) {
int n,i,j=1,count=0;
n=nums.length;
for(i=0;i<n-1;i++){
//删除部分同删除I,同样是使用双指针
if(nums[i]!=nums[i+1]){
nums[j]=nums[i+1];
j++;
count=0;
//将count归零,表示两者元素不同时,count从头开始计算(4)
}
else{
//加入else分支,如果相邻元素相同,使用count计数保留一个(1)
if(count<1){
//如果没被保留过则保留下来一个(2)
nums[j]=nums[i+1];
j++;
count++;
//count计数增加,表示保留过该元素(3)
}
}
}
return j;
}
}