LeetCode第二十七题-删除数组指定元素

博客围绕移除数组中指定值元素的问题展开。给定数组和值,需在原地删除该值的所有实例并返回新长度,且只能用O(1)额外内存。介绍了两种解法,分别分析了时间和空间复杂度,时间复杂度均为O(n),空间复杂度均为O(1)。

Remove Element

问题简介:给定数组nums和值val,在适当位置删除该值的所有实例并返回新长度.
不要为另一个数组分配额外的空间,必须通过使用O(1)额外内存修改输入数组来实现此目的.
举例:
1.给定数组 = [3,2,2,3], val = 3,
返回值为2,代表有两个不等于val的值,此时数组前两个值应为[2,2]

2:
给定数组 = [0,1,2,2,3,0,4,2], val = 2,
返回值为5,代表有五个不等于val的值,此时数组前两个值应为[0,1,3,0,4]

解法一:设定两个变量,并遍历一遍数组,i表示结果索引即不等于val的个数,j表示遍历的当前索引,当nums[i]!=nums[j]时,i++并赋值nums[j]

class Solution {
    public int removeElement(int[] nums, int val) {
        int length = nums.length; 
        if(length == 0)return 0;
        int i = 0;
        for(int j=0;j<length;j++){
            if(nums[j] != val){
                nums[i] = nums[j];
                i++;
            }
        }
        return i;
    }
}

复杂度分析
时间复杂度 : O(n)遍历一遍数组
空间复杂度:O(1)定义空间为有限个

解法二:
遍历数组,当前索引值等于val时,将当前索引值与n-1交换,n表示数组长度,每当符合要求时n-1

public int removeElement(int[] nums, int val) {
    int i = 0;
    int n = nums.length;
    while (i < n) {
        if (nums[i] == val) {
            nums[i] = nums[n - 1];
            // reduce array size by one
            n--;
        } else {
            i++;
        }
    }
    return n;
}

复杂度分析
时间复杂度 : O(n)遍历一遍数组
空间复杂度:O(1)定义空间为有限个

小白刷题之路,请多指教— — 要么大器晚成,要么石沉大海

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值