数组去除重复项的算法:
- Ⅰ、删除排序数组中的重复项(注意:是已经排好序的):
- 1、题目描述:
- 2、解题思路:
- 3、实现代码:
- Ⅳ、小结:
Ⅰ、删除排序数组中的重复项(注意:是已经排好序的):
1、题目描述:
给定⼀个排序数组,你需要在
原地
删除重复出现的元素,使得每个元素只出现⼀次,返回移除
后数组的新⻓度; 不要使⽤额外的数组空间,你必须在原地
修改输⼊数组 并在使⽤ 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。
你不需要考虑数组中超出新⻓度后⾯的元素。
2、解题思路:
使⽤快慢指针来记录遍历的坐标(我认为这是 C 的思想):
A、开始时这两个指针都指向第⼀个数字;
B、如果两个指针指的数字相同,则快指针向前⾛⼀步;
C、如果不同,则两个指针都向前⾛⼀步;
D、当快指针⾛完整个数组后,慢指针当前的坐标加 1 就是数组中不同数字的个数;
实际上这就是双指针中的快慢指针。在这⾥快指针是读指针, 慢指针是写指针。从读写指针考
虑, 我觉得更符合本质。
注意要点:
A、这道题如果不要求,O(n) 的时间复杂度, O(1) 的空间复杂度的话,会很简单。
但是这道题是要求的,这种题的思路⼀般都是采⽤双指针。
B、如果是数据是⽆序的,就不可以⽤这种⽅式了,从这⾥也可以看出排序在算法中的基础性
和重要性。
C、注意 nums 为空时的边界条件。
3、实现代码:
方式一、符合解题思路的代码与截图:
A、代码为:
// 去重函数:
var removeDuplicates = function (nums) {const size = nums.length;if (size == 0) return 0;let slowP = 0;for (let fastP = 0; fastP < size; fastP++) {if (nums[fastP] !== nums[slowP]) {slowP++;nums[slowP] = nums[fastP];}}return slowP + 1;
};// 发现此时的输出结果为:5(且此时的数组情况也是想要的结果,看方式二)
removeDuplicates([1,1,2,3,4,4,4,5])
B、截图为:
方式二、将非重复数组的长度及数组值输出的代码与截图:
A、代码为:
// 去重函数:
var removeDuplicates = function (nums) {const size = nums.length;if (size == 0) return 0;let slowP = 0;for (let fastP = 0; fastP < size; fastP++) {if (nums[fastP] !== nums[slowP]) {slowP++;nums[slowP] = nums[fastP];}}++slowP// 下面注释的着两种操作:都可以仅将想要的 nums 数组非重复的数据全展示出来(均已实践证实);// nums.splice(slowP)// nums = nums.splice(0,slowP)return {slowP, nums};
};// 此时的输出结果为:{"slowP": 5,"nums": [1,2,3,4,5,4,4,5]}
removeDuplicates([1,1,2,3,4,4,4,5])// 当然,倒序也是没有问题的(已实践证实);
// removeDuplicates([9,9,8,8,7,7,7,6,2,1])// 但,无序有问题(即:只支持排序数组);
// removeDuplicates([1,5,11,5,7,1,8,9,9,9,9,])
执行 removeDuplicates([1,1,2,3,4,4,4,5]) 函数后代码执行的过程:nums[fastP]值 fastP值 nums[slowP]值 slowP值1 0 1 01 1 2 2 2 13 3 3 24 4 4 34 5 4 6 5 7 5 4
// 此时 fastP 及 slowP 的值对应的 nums 的值就是最终的数组值;
B、截图为:
方式三、可能存在的问题:
A、代码为:
// 去重函数:
var removeDuplicates = function (nums) {const size = nums.length;if (size == 0) return 0;let slowP = 0;// 此时若是这里 fastP < size 修改为 fastP <= size,输出的 slowP 值没问题,但 nums 数组有问题;for (let fastP = 0; fastP <= size; fastP++) {if (nums[fastP] !== nums[slowP]) {slowP++;nums[slowP] = nums[fastP];}}return {slowP, nums};
};removeDuplicates([1,1,2,3,4,4,4,5])
// 问题剖析:
执行 removeDuplicates([1,1,2,3,4,4,4,5]) 函数后代码执行的过程:nums[fastP]值 fastP值 nums[slowP]值 slowP值1 0 1 01 1 2 2 2 13 3 3 24 4 4 34 5 4 6 5 7 5 4 undefined 8 undefined 5
Ⅳ、小结:
其一、哪里有不对或不合适的地方,还请大佬们多多指点和交流!
其二、若有转发或引用本文章内容,请注明本博客地址(直接点击下面 url 跳转
) https://blog.csdn.net/weixin_43405300,创作不易,且行且珍惜!
其三、有兴趣的话,可以多多关注这个专栏(Vue(Vue2+Vue3)面试必备专栏)(直接点击下面 url 跳转
):https://blog.csdn.net/weixin_43405300/category_11525646.html?spm=1001.2014.3001.5482