1.题目链接
26. 删除有序数组中的重复项
2.原题描述:
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。 返回 k 。
3.相关算法
本题考察数组相关的操作,涉及到的算法主要是双指针的使用,当然也可以使用双循环来暴力求解【时间复杂度O(n^2),空间复杂度O(1)】,本文使用双指针的解法【时间复杂度O(n),空间复杂度O(1)】
4.本题主要思路
本题采用双指针可以使用一个for循环来完成暴力双循环的解题,使用p指针来当目标指针,q指针当快指针,当nums[p]!=nums[q]时,将nums[q]赋值给nums[p+1],这样可以保证每个数值在数组中只有一个,赋值完以后p++,往前移动,等到q遍历完整个数组时返回p+1的到结果。
5.源码分析
class Solution {
public int removeDuplicates(int[] nums) {
if(nums == null || nums.length == 0) // 1
return 0;
int p = 0; // 2
int q = 1;
while(q < nums.length){ // 3
if(nums[p] != nums[q]){ // 4
nums[p + 1] = nums[q];
p++; // 5
}
q++; // 6
}
return p + 1; // 7
}
}
- 空值判断,若当前数组为空,或者长度为零则直接返回结果;(数组为空与数组长度为0并非相同,数组为空可能是没有分配内存空间为初始化,数组长度为0则已分配了内存空间只是暂时为放相应元素);
- 初始化双指针;
- 进行循环遍历,通过q指针来判断是否遍历完整个数组;
- 当p和q位置对应的值不相等是则将q对应的值覆盖p+1位置的值(不能覆盖p位置的值,应为并不知道p是第几个相同的数);
- 赋值完后p的位置往前一步进行迭代;
- 若p和q的位置不相等,则q++进行迭代;
- 返回不重复元素的个数(p的值是数值下标的值,题目要求的是返回元素的个数,所以要进行+1返回)。