【微信公众号:yi极】
删除有序数组中的重复项
题目描述:
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
方法1:快慢指针
思路:fast代表快指针,找到与慢指针不同的元素就把值赋给慢指针所指向的元素,直到快指针遍历完所有的元素,此时慢指针所指向的slow-1前的元素都是包含所有元素且不重复的。
public class Solution2 {
public static int removeDuplicates(int[] nums) {
int fast = 0;
int slow = 0;
while(fast < nums.length ){
nums[slow] = nums[fast];
while(fast < nums.length && nums[slow] == nums[fast]){
fast++;
}
slow++;
}
return slow;
}
}
方法2:快慢指针(2)
public class Solution1 {
public static int removeDuplicates(int[] nums) {
int n = nums.length;
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;
}
return slow;
}
}
测试代码:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.printf("请输入有序数组长度:");
int num = sc.nextInt();
int [] nums = new int [num];
System.out.print("请输入有序数组中的元素:");
for(int i = 0;i < num;i++){
nums[i] = sc.nextInt();
}
int len = removeDuplicates(nums);
System.out.printf("数组长度为:%d\n",len);
System.out.printf("数组元素为:");
for(int i = 0;i < len;i++){
System.out.printf("%d ",nums[i]);
}
}
运行结果: