力扣刷题27.移除元素(Accept03)

文章介绍了在Java中解决力扣27题——移除数组元素的方法,包括暴力解决法、同向双指针和相向双指针。暴力解决法因修改数组长度导致编译错误,正确做法是使用额外变量记录有效长度。双指针方法在O(n)的时间复杂度内完成,且空间复杂度为O(1),其中相向双指针可能改变数组顺序。
摘要由CSDN通过智能技术生成

力扣刷题

代码随想录数组 3.移除元素

力扣27. 移除元素

方法一:暴力解决法

1. 思路

两层嵌套循环遍历数组,内层循环主要是当第一层循环遍历到的元素等于要移除的元素的值的时候,其后的元素依次向前挪动一个位置(覆盖要删除的元素的位置)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xY6klCgK-1689904005137)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/046595b6-3781-4cfb-8b3b-42a32b42294b/Untitled.png)]

编译出错:cannot assign a value to final variable length

为什么报错?因为Java中数组是不允许被修改长度的!这是Java安全性的体现之一。

数组的内存是连续分配的,当我们增加数组长度时,就可能导致别的变量被覆盖;而减少长度的话,可能会突然空出来一个内存空间。

2. 正确解题代码

  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)
class Solution {
    public int removeElement(int[] nums, int val) {
        int size = nums.length; //定义成一个变量,但它并不是数组的实际长度
        for(int i = 0; i < size; i++){
            if(nums[i] == val){
                for(int j = i; j < size - 1; j++){
                    nums[j] = nums[j+1];
                }
                size--;  //这是我们认为的数组移除某元素之后的长度(但数组的实际长度并没有变化)
                i--; //当前的元素已经被后一个元素所替代,又因为等会要i++,所以应该先向前挪动一个
            }
        }
        return size;
    }
}

方法二:同向双指针(快慢指针)

class Solution {
    public int removeElement(int[] nums, int val) {
				//同向双指针
        //快指针是遍历数组的时候找值不为val的元素,
				//慢指针是用来得到新的数组长度(覆盖要移除的元素的位置)
        int slowIndex = 0;
        for(int fastIndex = 0; fastIndex < nums.length; fastIndex++){
            if(nums[fastIndex] != val){
                nums[slowIndex++] = nums[fastIndex];
            }
        }
        return slowIndex;
    }
}

方法三:相向双指针

class Solution {
    public int removeElement(int[] nums, int val) {
        //相向双指针
        //左指针是用来得到新的数组长度(覆盖要移除的元素的位置),
				//右指针是从右边开始向左边遍历找值不为val的元素
        int rightIndex = nums.length - 1;
        int leftIndex = 0;
        while(rightIndex >= 0 && nums[rightIndex] == val) rightIndex--;
        while(leftIndex <= rightIndex){
            if(nums[leftIndex] == val){ //当左指针指向的元素等于要移除的值,则用右指针的元素值进行覆盖
                nums[leftIndex] = nums[rightIndex--];
            }
            leftIndex++; //左指针向前继续挪动
            while(rightIndex >= 0 && nums[rightIndex] == val) rightIndex--;//右指针继续寻找下一个值不为val的元素
        }
        return leftIndex;
    }
}

同向与相向的对比:

  1. 同向双指针最后元素的相对位置没有发生变化,而相向双指针最后的元素相对位置可能发生变化,即数组的相对顺序发生了改变
  2. 同向双指针和相向双指针两者的时间复杂度及空间复杂度都是一样的
    1. 时间复杂度:O(n)
    2. 空间复杂度:O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值