题目描述:
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
分析:
我们很容易想到的方法就是暴力求解法:
指定一个i和j变量,i指示当前的位置,j用于向后检测,如果遇到相同数字,则将数据全部往前挪
图解:
但这是最基本的暴力求解法,复杂度已经高达o(n2),所以这种方法显然不行
我们可以考虑使用双指针法,可将复杂度提升至o(n)
用一个slow指针来依次存储元素,用fast来检测是否有相等元素
当slow与fast相等时,直接fast++
slow与fast不等,先slow++,将fast赋给slow,之后fast++
最后返回元素个数,我们返回slow+1即可
图解:
代码实现
int removeDuplicates(int* nums, int numsSize){ if(!numsSize) { return 0; } int slow=0; int fast=0; while(fast欢迎分享,转载请注明来源:内存溢出
评论列表(0条)