26.删除有序数组的重复项
题目详情:
给定一个有序数组nums,请 原地 删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。不使用额外的数组空间,必须在 原地 修改输入数组,并在使用 O(1) 额外空间的条件下完成。
示例1:
输入: nums = [1,1,2]
输出: 2,nums = [1,2]
解释: 函数返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
示例2:
输入: nums = [0,0,1,1,1,2,2,3,3,4]
输出: 5, nums = [0,1,2,3,4]
解释: 函数返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
方法一: 双指针(快慢指针)
- 给定的数组为有序数组,表明所有重复的元素必定相邻;
- 要求删除所有重复项,其实只是为了将所有不重复的元素移到数组的左侧。
- 左侧指针为慢指针记为slow,右侧指针为快指针记为fast;
- 算法流程:
循环以下1)、2):while (fast < nums.length)
1). 如果 slow == fast,则fast+1,即. fast后移一位
2). 如果slow != fast,则fast位置上的元素赋值给slow+1位置上,并且slow和fast均后移一位;
3). return slow+1;
class Solution {
public int removeDuplicates(int[] nums) {
if(nums == null || nums.length == 0) return 0;//判断数组中是否为空
int slow = 0;//初试化慢指针
int fast = 1;//初试化快指针
while(fast < nums.length){//循环条件:只要快指针地址不超过数组长度,则一直循环
if(nums[slow] != nums[fast]){//判断不等的情况
nums[slow + 1] = nums[fast];
slow++;
}
fast++;//执行相等的情况
}
return slow + 1;//最后返回的是数组的元素个数,而slow是下标,所以返回需要+1
}
}
方法二: 通用解法
题目要求使每个元素只出现一次,通用解法改为每个元素出现k次。
步骤:
- 由于保留k个相同的元素,对于前k个元素,可以直接进行保留
- 对于后面任意的元素,能够保留的前提是:与当前写入位置的第k个元素进行比较,不相同则保留。
class Solution {
public int removeDuplicates(int[] nums) {
return process(nums, k);
}
int process(int[] nums, int k) {
int u = 0;
for (int x : nums) {
if (u < k || nums[u - k] != x) nums[u++] = x;
}
return u;
}
}
- 于是,此题每个元素只出现1次,把return中的k改成1即可。
class Solution {
public int removeDuplicates(int[] nums) {
return process(nums, 1);
}
int process(int[] nums, int k) {
int u = 0;
for (int x : nums) {
if (u < k || nums[u - k] != x) nums[u++] = x;
}
return u;
}
}
80.删除有序数组的重复项Ⅱ
示例1:
输入: nums = [1,1,1,2,2,3]
输出: 5, nums = [1,1,2,2,3]
解释: 函数返回新长度 length = 5,并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。
示例2:
输入: nums = [0,0,1,1,1,2,2,3,3,4]
输出: 5, nums = [0,1,2,3,4]
解释: 函数返回新的长度 5,并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。
因为每个元素保留2个相同元素,只要把k设为2即可。
class Solution {
public int removeDuplicates(int[] nums) {
return process(nums, 2);
}
int process(int[] nums, int k) {
int u = 0;
for (int x : nums) {
if (u < k || nums[u - k] != x) nums[u++] = x;
}
return u;
}
}
注释:写的不好之处请您纠正,新手小白,期待您来指教!!!