题目:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/1/array/21/
描述:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
解题思路:
利用快慢指针思想,用两个标记对同一个数组进行遍历。开始时快慢指针都指向开头,接下来快指针先向下遍历,遇到不同的元素时,将慢指针移动,并且使慢指针指向的元素替换为不同的元素。以此类推,最终获得的j+1便是所需要目标数组的长度。
代码:
class Solution {
public int removeDuplicates(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int i=0;
int j=0;
for(;i<nums.length;i++){
if(nums[i]!=nums[j])
nums[++j]=nums[i];
}
return j+1;
}
}
反思:
刚开始时,只想用一个指针来操作,想通过两个for循环循环来将改变后的数组,全部下表前移 ……时间复杂度太高了,而且不好实现。