LeedCode 26.删除有序数组中的重复项

26. 删除有序数组中的重复项

题目描述:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array

作者:joker D888,QQ:1783779005,如要转载请与我联系

(重复元素若有两个或以上原理相同)
代码如下:

int removeDuplicates(int* nums, int numsSize)
{
    
    
	if (numsSize == 0)
		return 0;
	int prev = 0, cur = 1, dst = 0;
	while (cur < numsSize)
	{
    
    
		if (nums[prev] != nums[cur])
		{
    
    
			nums[dst] = nums[prev]; 
			prev++;
			cur++;
			dst++;
		}
		else
		{
    
    
			prev++;
			cur++;
		}
	}
	//最后一个元素还没有进行判断
	nums[dst] = nums[prev];
	dst++;
	prev++;

	return dst;	
}

  • 还可以用指针形式,思路同上:两个指针pr,ps,pr遍历数组,ps修改数组元素,当*(pr + i) == (ps + 1 + i),即这两个元素相同重复了,此后i++,在向后遍历,直到(pr + i) != (ps + 1 + i),说明此时的两个元素不同,而且此时的(pr+i)是多个重复元素里的最后一个(因为数组有序),现在只要把这个元素赋值给*(ps + j)即可。
int removeDuplicates(int* nums, int numsSize) 
{
    
    
	
	if (numsSize == 0)
		return 0; 
	if (numsSize == 1)
		return 1;
	//保证数组起码有两个元素
	int* pr = nums;
	int* ps = nums;
	int i = 0;
	int j = 0;
	for (i = 0; i+1 < numsSize ; i++)
	{
    
    
		if (*(pr + i) == *(ps + 1 + i))
		{
    
    
			;
		}
		else
		{
    
    
			*(ps + j) = *(pr + i);
			j++;
		}
	}
	*(ps + j) = *(pr + i);
	j++;
	return j;

}

如有错误欢迎指出,或提出你的解题思路或看法。

猜你喜欢

转载自blog.csdn.net/jokerMingge/article/details/115426082
今日推荐