删除一个有序数组中的重复元素

时间:2022-06-22
本文章向大家介绍删除一个有序数组中的重复元素,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/zy010101/article/details/81302145

题目来自leetcode初级算法的数组

  • 方案一

因为这个数组是有序的,所以删除的时候可以这样做。使用最小数字减去1来标记作为被删除掉的元素。然后再把数组中的有效元素移动位置就可以了。使用C语言实现如下:

int removeDuplicates(int* nums, int numsSize) {
    int temp = nums[0];
	int count = 1;
	int j;
    if(0 == numsSize)                //若没有数组,则返回0
    {
        count = 0;
    }
	else
    {
        for (int i = 1; i < numsSize; i++)
	{
		if (temp == nums[i])
		{
			nums[i] = nums[0] - 1;	//标记删除
		}
		else
		{
			temp = nums[i];
			count++;                //纪录删除后的元素个数
		}
	}
	for (int i = 1; i < numsSize; i++)
	{
		if (nums[0] - 1 == nums[i]) //删除掉的元素
		{
			for (j = i + 1; nums[0] - 1 == nums[j] && j < numsSize; j++);//下一个有效元素
			if (nums[0] - 1 != nums[j] && j < numsSize)
			{
				nums[i] = nums[j]; //移动它
				nums[j] = nums[0] - 1;//删除它
			}
		}
	}
    }
	return count;
}

这样做其实比较麻烦的。我提交了之后看了一下解法,使用的办法比较简单。

  • 方案二

只去看它后面的元素是否有和它相同,若有相同则把该元素移动到当前位置的下一个位置即可。然后继续向后找看是否有相同的元素。该算法也是简单的,比较易理解的。

int removeDuplicates(int* nums, int numsSize) {
    int i = 1;
    if(0 == numsSize)
    {
        i = 0;
    }
    else
    {
        for(int j = 1; j < numsSize; j++)
        {
            if(nums[j] != nums[i])
            {
                i++;
                nums[i] = nums[j];
            }
        }
    }
    return i;
}