LeetCode Remove Duplicates from Sorted Array(C语言O(n)解法)

题目:

Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length.

Do not allocate extra space for another array, you must do this in place with constant memory.

For example,
Given input array A = [1,1,2],

Your function should return length = 2, and A is now [1,2].

简单解释一下题目,使用常量的空间复杂度去掉数组中重复的元素,本题使用O(n^2)的解法会超时。


解题思路:

解决本题有两个非常容易想到的思路一是不使用额外的数组空间,将重复的数字通过移位后面的覆盖前面的,完成去重工作,时间复杂度为O(n^2),另外一个思路是使用一个额外的数组空间,将重复数组复制到新的数组中遇到重复的只需复制一次。时间复杂度是O(n),空间复杂度为O(n)。

结合上面两个思路可以想到第三种思路,即用原来的数组作为新的数组空间进行复制(使用两个下标,一个指向原数组,一个指向新的数组),即循环一次如果该元素不是重复的元素则直接进行赋值,否则就移动原数组下标,跳过重复的元素,然后继续循环,时间复杂度为O(n),空间复杂度为O(1)。


AC代码如下:

int removeDuplicates(int A[], int n) {
    int i,j;
    j=0;
    for(i=0;i<n;++i)
    {
    	if(A[i]!=A[i+1])
    	{
    		A[j]=A[i];//元素不重复直接赋值 
			++j;
    	}
    	else
    	{
    		while(A[i]==A[i+1])
    			++i;//跳过重复元素 
    		A[j]=A[i];
    		++j;
    	}
    }

    return j;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值