leetcode 26题题解

题目比较简单,开始为了省事使用的方法1,看见时间224ms确实有点高,就改成方法二了39ms

方法一:对数组从后向前便利,碰见一个重复数组就把后面的元素全部前移,实现比较简单,由于有大量元素移动,时间很长。


方法二:对数组从前向后遍历,使用两个变量spst和sped记录数组中的无效元素,start变量循环找到新元素直接放到spst位置。少了大量元素移动,所以比较快。



下面给出代码:

方法一代码:

class Solution {
public:
   int removeDuplicates(int A[], int n) {
        int  t = 0,before = n-1,after = n-1,count = n;
		while( before > 0 )
		{
			before--;
			if( A[before] == A[after] )
			{
				t = before+1;
				while( t < count )
				{
					A[t-1] = A[t];
					t++;
				}
				after = before;
				count--;
			}
			else
			{
				after--;
			}
		}
		return count;
    }
};


方法二代码:

int removeDuplicates(int A[], int n) {
		 if( n == 0 || n == 1 )
			 return n;
        int start = 1,val = 0 , spst;
		//找第一个空闲元素位置
		while( start < n )
		{
			if( A[start] != A[val] )
			{
				start++;
				val++;
			}
			else
			{
				spst = start;
				break;
			}
		}
		//start = n 则无重复元素,返回n
		if( start == n )
			return n;
		else
		{
			//处理空闲元素后的元素
			while( start < n )
			{
				//找第一个有效元素位置
				while( start < n && A[start] == A[val] )
				{
					start++;
				}
				//如果找到,有效元素前移到spst位置,更新spst、start、val值
				if( start != n )
				{
					A[spst++] = A[start++];
					val++;
				}
			}
			//最后长度为val值+1
			return val+1;
		}
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值