1、解题思路
从最终结果来看,子数组中依次记录的是不重复的数组元素。因此,目标拆分为两点:
1)找到数组中所有不重复的元素;
2)将找到的不重复元素依次填入子数组中。
比较直观的解法是,先遍历原数组A,把不重复的元素记录在另一数组B中,再把B中元素填到A首元素开始的子数组中。
题目要求不使用额外数组,并只能使用0(1)额外空间。
再看直观解法的分析,新增了数组B,这部分空间是可以省去的,因为并不需要把所有不重复元素找出来再填入原数组中。
1)设定变量last,记录最新找到非重复元素,初始值为首元素;
2)设定变量count,记录目前已找到非重复元素个数,初始值设为1,新找到非重复元素可填入数组第count位;
3)从1开始遍历数组,判断当前元素是否与last相同,相同则跳过,否则记录到count未,并更新last和count值;
2、有效题解
int removeDuplicates(int* nums, int numsSize) {
if (NULL == nums || numsSize < 0)
{
return -1;
}
if (0 == numsSize)
{
return 0;
}
int last = nums[0];
int count = 1;
for (int i = 1; i < numsSize; i++)
{
if (nums[i] != last)
{
nums[count] = nums[i];
last = nums[i];
count++;
}
}
return count;
}
3、小结
关注程序时间复杂度和空间复杂度,有时可能需要牺牲一者来优化另一者,当没有这种诉求时应尽可能使两者都最优。
改进点:
1、比较数组首尾元素,当首尾元素相同时,可免去遍历数组;
2、