力扣刷题-27.移除元素

82 阅读1分钟

原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。

 var removeElement = function(nums, val) {
    let count = nums.length
    for(let i = 0;i < count;i++){
        if(nums[i] === val){
            nums.splice(i,1)
            i--
            count--
        }
    }
    console.log('nums',nums)
    return nums.length
};

总结:没有体现出算法,利用的是数组的 方法,并且 强行让它成功;繁琐,理解成本大

思路:

设置两个指针,一个从数组的头部开始,一个从数组的尾部开始,先判断left指向的元素是否为val,不是则left向前一步,是则将right的值赋值给left,如果让right值向前一步,再来判断赋值后的left值是否为val,这样val就到数组的后面

时间复杂度为O(n)

空间复杂度为O(1)

var removeElement = function(nums, val) {
    let l = 0,r = nums.length - 1;
    while(l < r){
        // 将不是val的值放在左边
        if(nums[l] === val){
            nums[l] = nums[r]
            r-- 
        } else {
            l++
        }
    }
    return l + 1
};
var removeElement = function(nums, val) {
    let left = 0;
    let right = nums.length;
    while (left < right) {
        if (nums[left] === val) {
            nums[left] = nums[right-1];
            right--;
        } else {
            left++;
        }
    }
    return left;
};
var removeElement = function(nums, val) {
    let l = 0,r = nums.length - 1;
    while(l <= r){
        // 将不是val的值放在左边
        if(nums[l] === val){
            nums[l] = nums[r]
            r-- 
        } else {
            l++
        }
    }
    return l
};