27. Remove Element,原地删除array中指定元素

-- TOC --

题目

Given an integer array nums and an integer val, remove all occurrences of val in nums in-place. The order of the elements may be changed. Then return the number of elements in nums which are not equal to val. Consider the number of elements in nums which are not equal to val be k, to get accepted, you need to do the following things:

跟前一题类似,也是要求原地删除array中指定的元素,返回剩余元素的数量。理论上分析,避免对array内的数据进行move,才是快速的做法。但实际上,Python的暴力解法会更快,因为那些builtin接口都是C的速度。Anyway...我们采用理论上快速的\(O(N)\)解法。

Example 1:
Input: nums = [3,2,2,3], val = 3
Output: 2, nums = [2,2,_,_]
Explanation: Your function should return k = 2, with the first two elements of nums being 2.
It does not matter what you leave beyond the returned k (hence they are underscores).

Example 2:
Input: nums = [0,1,2,2,3,0,4,2], val = 2
Output: 5, nums = [0,1,4,0,3,_,_,_]
Explanation: Your function should return k = 5, with the first five elements of nums containing 0, 0, 1, 3, and 4.
Note that the five elements can be returned in any order.
It does not matter what you leave beyond the returned k (hence they are underscores).

Constraints:

Python

简单的循环:

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        r = 0
        for i in range(len(nums)):
            if nums[i] != val:
                nums[r] = nums[i]
                r += 1
        return r

复杂一点的,还是循环:

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        r = i = 0
        j = len(nums) - 1
        while i <= j:
            if nums[j] == val:
                j -= 1
                continue
            r += 1
            while i<j and nums[i]!=val:
                r += 1
                i += 1
            nums[i] = nums[j]
            i += 1
            j -= 1
        return r

几乎没有使用额外的内存。LeetCode的排名偏差太大了!

C++

class Solution {
public:
    int removeElement(vector<int>& nums, int val) noexcept{
        int r {};
        for(size_t i{}; i<nums.size(); ++i)
            if(nums[i] != val)
                nums[r++] = nums[i];
        return r;
    }
};

C

int removeElement(int* nums, int numsSize, int val) {
    int r = 0;
    for(int i=0; i<numsSize; ++i)
        if(nums[i] != val)
            nums[r++] = nums[i];
    return r;
}

本文链接:https://cs.pynote.net/ag/leetcode/202311081/

-- EOF --

-- MORE --