数组 - 26. 删除有序数组中的重复项(C#和C实现)
题目描述
给你一个有序数组 nums
,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
解题思路
由于数组已经是有序的,所以重复的元素必然相邻。
- 定义一个指针
left
,初始时指向数组的第一个元素。 - 遍历数组,如果当前元素
nums[i]
不等于上一个元素nums[i-1]
,则将其复制到nums[left]
的位置,并将left
指针向后移动一位。 - 遍历结束后,
left
指针的位置即为新数组的长度。 - 返回
left
作为结果。
解题实现
C#
public int RemoveDuplicates(int[] nums)
{
if (nums.Length == 0)
return 0;
int left = 1;
for (int i = 1; i < nums.Length; i++)
{
if (nums[i] != nums[i - 1])
{
nums[left] = nums[i];
left++;
}
}
return left;
}
public int RemoveDuplicates(int[] nums)
{
int left = 0;
int right = 1;
while (right < numsSize)
{
if (nums[left] != nums[right])
{
nums[left + 1] = nums[right];
left++;
}
right++;
}
return left + 1;
}
C
int removeDuplicates(int* nums, int numsSize) {
if (numsSize == 0)
return 0;
int left = 1;
for (int i = 1; i < numsSize; i++)
{
if (nums[i] != nums[i - 1])
{
nums[left] = nums[i];
left++;
}
}
return left;
}
复杂度分析
- 时间复杂度:O(n),其中 n 为数组的长度。需要遍历一次数组。
- 空间复杂度:O(1)。只使用了常数个额外空间。
参与点评
读者朋友们,如果您在阅读过程中,对文章的质量、易理解性有任何建议,欢迎在评论区指出,我会认真改进。