题目说明
- 给一个升序排列的数组nums,请原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。
- 元素的相对顺序应该保持一致。如果在删除重复项之后有k个元素,那么nums的前k个元素应该保存最终结果。
- 将最终结果插入nums的前k个位置后返回k。不需要考虑数组中超出新长度后面的元素。
- 不要使用额外的空间,并在使用 O(1) 额外空间的条件下完成。
示例 1:
输入:nums = [1,1,2]
输出:2, nums = [1,2]
示例 2:
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
提示:
0 <= nums.length <= 3 * 10^4
-10^4 <= nums[i] <= 10^4
nums已按升序排列
解法
【基于Java】
//-----------------main------------------------
// 可改成控制台输入
int[] nums = {1,2,3,5,6,6};
int realLength = delMultiNum(nums);
// 输出格式
System.out.println("去重后数组元素长度为:" + realLength);
System.out.print("[");
for (int i = 0; i < realLength; i++){
if(i+1 == realLength){
System.out.print(nums[i]);
} else {
System.out.print(nums[i]+",");
}
}
System.out.print("]");
//-----------------method------------------------
private static int delMultiNum(int[] nums) {
// 定义快慢指针
int i = 0;
int j = 1;
// 排除异常情况
int length = nums.length;
if (length == 0 || length == 1 ){
return length;
}
while (j < length){
// 如果慢指针所指的值小于了快指针所指的值
if (nums[i] < nums[j]){
// 说明慢指针的下一个位置上的值应该是快指针所指的值
nums[i+1] = nums[j];
// 不必再比较当前位置了,于是慢指针后移
i++;
}
// 每一轮比较时:
// 不符合赋值情况:快指针后移,比较下一个;
// 符合赋值情况:赋值后慢指针和快指针所指的值一定相同,没有再次比较的必要,快指针也后移
j++;
}
// 因为是返回数组长度,所以要元素下标加1
return i+1;
}
思路
- 双指针:移动规则
- 排除异常情况
- 循环比较值大小:循环结束条件
- 符合条件赋新值