一、题目描述
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。
二、理解题意
删除重复出现的元素,使每个元素只出现一次返回移除后数组的新长度
双指针解法:
- 定义两个指针(索引)分别指向目标位和待移动元素位
• 初始目标位为0,待移动元素位为1 - 比较两个指针对应的数据
• 比较相等:目标位不变,待移动位加1
• 比较不等:目标位加1,待移动元素赋值到目标位;待移动位加1
什么情况下使用双指针:
两个按照一定规律同步变化的数据;
合理的使用双指针能将时间复杂度从O(n^2)降低到O(n)级别.
三、Choose 数据结构及算法思维选择
-
数据结构:给定的数组
-
算法思维:遍历、双指针
四、代码实现
public int removeDuplicates(int[] nums) {
// 1.定义两个指针(索引)分别指向目标位和待移动元素位
int target = 0; // 目标位指针
for (int i = 1; i < nums.length; i++) { // i为待移动位指针
// 2.比较两个指针对应的数据
if (nums[target] != nums[i]) {
// 不相等,则把目标位置后移
if (++target != i) {
nums[target] = nums[i];
}
}
}
return target + 1;
}