赞
踩
活动地址:CSDN21天学习挑战赛
目录
为什么要说算法的从会用到理解?正如很多朋友一样,我们都是“成熟”的程序员了,惯用了各种依赖包,也就放弃了对算法的深究,所以处理各种实用场景信手拈来(哈哈,不要脸了),但是,最近在处理和思考优化方面的问题,深究之后,发现万变不离其宗,代码优化的一大部分工作还是要从算法上解决。
趁此机会,也督促自己去深层理解理解算法的实质。
算法的题目会来自leecode以及活动负责人的算法讲解。
给你一个 升序排列 的数组
nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。输入:nums = [1,1,2] 输出:2
由于数组nums为有序的升序数组,即存在重复的数据都是相邻的。所以我们只需要得到两个相邻元素不同的所有元素即可。此时我们就可以使用双指针来处理,设快指针为fast,慢指针为slow;
- function uniq(nums) {
- let length = nums.length;
- if (length === 0) {
- return 0;
- }
- let fast = 1,
- slow = 1;
- while (fast < length) {
- if (nums[fast] !== nums[fast - 1]) {
- nums[slow] = nums[fast];
- ++slow;
- }
- ++fast;
- }
- return slow;
- }
- uniq([1, 1, 2]);
输出值为2;
时间复杂度:O(n),其中 n 是数组的长度。快指针和慢指针最多各移动 n 次。
空间复杂度:O(1)。只需要使用常数的额外空间。
for循环倒序遍历,删除重复的数据;
- function uniq2(nums) {
- for (let i = nums.length - 1; i >= 0; --i) {
- if (nums.indexOf(nums[i]) !== i) nums.splice(i, 1);
- }
- return nums.length;
- }
-
- uniq2([1, 1, 2]);
注意:千万不能使用正序for循环删除元素,如果是正序for循环,则会导致删除元素的下一个元素错过循环;
for循环倒序遍历方法可以面对无序数组的处理或者其他字段的处理,但是我们也可以通过自己将数组变为有序数,将其改造为符合双指针操作的条件。
一句老话:
只要思想不滑坡,方法总比困难多!
觉得有用的话,一键三连吧!点赞、收藏、评论!
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。