题目辨析
1.给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组。
(见leetcode第26题 删除排序数组中的重复项)
输入:112
输出:12
2.给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组。
(见leetcode第80题 删除排序数组中的重复项II)
输入:111223
输出:11223
待续
JAVA代码
1.给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次
算法思想: 放置两个指针 slow 和 fast,其中 slow 是慢指针,而 fast 是快指针。只要 nums[slow]=nums[fast],我们就增加 fast 以跳过重复项
public static int[] removeDuplicates1(int[] nums) {
if(nums.length==0) return new int[0];
int slow=0;
for(int fast=1; fast<nums.length;fast++){
if(nums[fast]!=nums[slow])
slow++;
nums[slow]=nums[fast];
}
return Arrays.copyOf(nums,slow+1);
}
2.给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次
算法思想: 增加一个重复个数的状态repeatNum;当快指针指向的是和慢指针相同的元素,用repeatNum判断
public static int[] removeDuplicates2(int[] nums) {
if(nums.length==0) return new int[0];
int slow=0;
int repeatNum=1;
for(int fast=1;fast<nums.length;fast++) {
if(nums[fast]!=nums[slow]) {
nums[++slow]=nums[fast];
repeatNum=1; //计数清楚
}
else {
if(repeatNum<2) {
nums[++slow]=nums[fast];
repeatNum++;
}
}
}
return Arrays.copyOf(nums,slow+1);
}
测试用例
public static void main(String[] args) {
int nums1[]= {1,1,2};
System.out.println(Arrays.toString(removeDuplicates1(nums1)));
int nums2[]= {1,1,1,2,2,3};
System.out.println(Arrays.toString(removeDuplicates2(nums2)));
}