leetcode 刷题之路 86 Remove Element

Given an array and a value, remove all instances of that value in place and return the new length.

The order of elements can be changed. It doesn't matter what you leave beyond the new length.

给定一个数组和一个数字,删除数组中相同的数字并返回数组的新长度。

这道题解法很多,第一种,每删除一个数字都将后面的所有的数字前移,O(n^2)复杂度。

第二种,使用变量i,j分别表示新旧数组的下标,当数组值和给定数字不同时,将A[j]赋值给A[i],否则,直接跳过不赋值,这样做的时间复杂度为O(n)。

代码如下:

class Solution {
public:
    int removeElement(int A[], int n, int elem) 
    {
        int i=-1,j;
        for(j=0;j<n;j++)
        {
            if(A[j]!=elem)
                A[++i]=A[j];
            else
                continue;
        }
        return i+1;
    }
};

第三种,使用下标i,j分别从数组两边开始遍历,i停在左边开始第一个和给定数字相同的位置处,j停在右边开始第一个和给定数字不同的位置处,用j处的数字填补i处位置,相当于执行了删除操作,一直执行直到i>=j。

这种方法的代码:

class Solution {
public:
    int removeElement(int A[], int n, int elem) 
    {
        int i=0,j=n-1;
        while(i<=j)
        {
            while(i<=j&&A[i]!=elem)
                i++;
            while(i<=j&&A[j]==elem)
                j--;
            if(i>j)
                return j+1;
            A[i]=A[j];
            i++;
            j--;
        }
        return j+1;
    }
};

第三种方法的时间复杂度也是O(n),但是和第二种方法相比少了很多不需要的赋值操作,因为题目没有要求保持原数组的顺序,所以推荐第三种方法。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值