LeetCode(27)Remove Element

183 篇文章 0 订阅
47 篇文章 36 订阅

题目如下

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.

给定一个数组,数组中含有一些数,可能包含重复的元素。给定一个数element,要求把数组中等于element的元素删除之后返回新的数组的长度。本题比较好玩儿的一点儿是,结尾只要求返回新的数组的长度,并不要求返回新的数组。所以可以利用这一点来节省时间。

如果每次找到element都删除这个元素并且把剩下的元素依次向前挪动一位,显然太浪费时间。
考虑到只需要返回新的数组的长度,可以把element和数组的最后一位做个交换。这样不断地进行下去直到把数组的所有元素遍历一遍。最后element元素都在先前的交换过程中被放到了数组后面。
注意到每次做交换时,是把数组的当前最后一位和element做交换。当前最后一位可能仍然是需要删除的element,于是交换后的新元素也需要做检查。

代码如下

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

update: 2014-10-09

因为题目是只要求返回n,所以除了交换这个办法,还可以用逐步生成新数组的方法,并且这个新数组覆盖原数组。 思路和这道题remove duplicates from sorted array目非常像

class Solution {
public:
    int removeElement(int A[], int n, int elem) {
        int keep_index = 0;
        for (int index = 0; index < n; ++index) {
            if (A[index] != elem) {
                A[keep_index] = A[index];
                ++keep_index;
            }
        }
        return keep_index;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值