1、题目介绍
- 题目详情【编号26】
- 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
- 考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。返回 k 。
2、我的思路及代码
class Solution {
public int removeDuplicates(int[] nums) {
/**
方法一:双指针+数组a[n],让数组记录每个唯一值的位置与值,并返回相应值。时O(n),空O(n)。
方法二:
1、单纯双指。时O(n),空O(1).
2、需要辅助变量num值用于计算每个唯一值应该跳跃的次数。
3、使用前后双指针,front用于定位第一个唯一值,end用于定位重复值。
4、当end没有再遇到与front相同的值时,令nums[count++] = nums[front],并令front = end。
注意:这题为有序数组,我使用的是方法二更好,若为无序数组,要么排序再用方法二,或者直接使用方法一.
*/
int front = 0,end = 0,count = 0,n = nums.length;
while(++end < n){
if(end < n && nums[front] != nums[end]){
nums[count++] = nums[front];
front = end;
}
}
if(count != 0 && nums[front] != nums[count - 1]){
nums[count++] = nums[front];
}
if(count == 0){
nums[count++] = nums[front];
}
return count;
}
}
3、官方题解
4、结论
- 我这种解法其实和官方题解意思上可能相差不是特别大,但是我没用快慢双指针,而是使用了普通双指针。
- 我认为只要找到非重复的数字然后跳跃过去即可,然后使用count来记值。
- 但是count记值使得我之前设定的front这个指针变得毫无意义,不如只设定end指针即可得到值。
- 题解中直接确定了数组只有一位数的时候就一定是唯一值,而我没有确定这个规则,导致后面需要用判断来弥补一些错误。
- 并且我是从前往后比对是否是唯一值或者说是重复值,而题解则是从后往前比较值,这也不用去特意判断数组越界问题,并解决了后续还需要一些弥补的判断来确认最终值。