[LeetCode]27. Remove Element

27. Remove Element

Given an array and a value, remove all instances of that value in place and return the new length.
Do not allocate extra space for another array, you must do this in place with constant memory.
The order of elements can be changed. It doesn’t matter what you leave beyond the new length.

Example:

Given input array nums = [3,2,2,3], val = 3
Your function should return length = 2, with the first two elements of nums being 2.

分析

题目要求在不使用额外空间条件下删除一个数组中等于某个特定值所有元素,然后返回数组的长度;题目还说元素的顺序可以改变,并且在新数组长度之后的元素可以不关心。

其中一个解法和删除有序数组中的重复元素类似,使用一个索引记录当前新数组长度,然后依次遍历数组,元素不等于特定值时,长度+1,否则不变;

另一个方法是在元素和特定值相等时可以将其和最后一个元素进行交换,并将最后一个元素的索引前移,这种方法可以避免元素的复制操作。

源码

class Solution {
public:
    // 方法1:因为可以打乱原来元素的顺序,所以可以在找到数后和最后一个数进行交换
    int removeElement(vector<int>& nums, int val) {
        int last = nums.size() ;
        int i = 0;
        while(i < last) {
            if(nums[i] == val) { // 当前元素需要被删除
                nums[i] = nums[last - 1]; // 将当前元素和最后一个元素交换
                last--; // 最后元素位置前移,但当前检查元素位置不后移
            } else {
                i++; // 当前元素后移
            }
        }
        return last;
    }

    // 方法一:数组长度索引
    int removeElement(vector<int>& nums, int val) {
        int index = 0;
        for(int i = 0; i < nums.size(); i++) {
            if(nums[i] != val) {
                nums[index++] = nums[i];
            }
        }
        return index;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值