27. 移除元素

题目:移除元素

链接:link

解决思路

思路一:拷贝覆盖
  • 设置下标 i n d e x index index,从0开始,将与val不同的值拷贝到下标为 i n d e x index index的数组中,相同的直接跳过,不拷贝;
  • 这种思路在移除元素较多时更适合使用,最极端的情况是全部元素都需要移除,遍历一遍结束即可;
  • 时间复杂度: O ( n ) O(n) O(n),空间复杂度: O ( 1 ) O(1) O(1)
代码
/**
 * 本类提供了一个解决方案,用于从整数数组中移除指定值的所有实例,并返回修改后数组的新长度。
 * 方法 `removeElement` 实现了这一功能。
 *
 */

class Solution {

    /**
     * 从输入的整数数组 `nums` 中移除所有值为 'val' 的元素。
     * 该方法通过将非目标元素向左移动并保持其原始顺序的方式,就地修改数组。
     * 函数返回移除过程完成后数组的新长度,
     * 这个长度表示数组中不含指定值的有效元素个数。
     *
     * @param nums 待处理的整数数组,其中某些元素可能需要被移除
     * @param val 需要从数组中移除的指定整数值
     * @return 新的数组长度,即移除指定值后有效元素的数量
     */
    public int removeElement(int[] nums, int val) {
        int index = 0;
        for (int i : nums) {
            if (i != val) {
                nums[index] = i;
                index++;
            }
        }
        return index;
    }
}

思路二:双指针
  • 设置两个指针, l o w low low指向首、初始值为0, h i g h high high指向尾、初始值为 n u m s . l e n g t h − 1 nums.length-1 nums.length1
  • l o w low low开始,若当前值与 v a l val val相同,则与 h i g h high high处的值对调,然后 h i g h high high左移一个数;若不相同,则不需要做处理, l o w low low右移一个数;
  • 这种思路在移除元素较少时更适合使用,最极端的情况是没有元素需要移除,遍历一遍结束即可;
  • 时间复杂度: O ( n ) O(n) O(n),空间复杂度: O ( 1 ) O(1) O(1)
代码
    /**
     * 从输入的整数数组 `nums` 中移除所有值为 'val' 的元素。
     * 该方法采用双指针策略,其中:
     *   - 'low' 指针从左到右扫描数组;
     *   - 'high' 指针起始于数组末尾并向 'low' 指针方向移动。
     * 当 'low' 指针处的值等于 'val' 时,用 'high' 指针处的值替换之,
     * 从而将非目标元素向数组左侧移动,并减小 'high' 指针。
     * 当 'low' 和 'high' 指针相遇或交叉时,表明数组左侧已成功移除所有 'val' 实例。
     * 函数返回移除过程完成后数组的新长度,
     * 这个长度表示数组中不含指定值的有效元素个数。
     *
     * @param nums 待处理的整数数组,其中某些元素可能需要被移除
     * @param val 需要从数组中移除的指定整数值
     * @return 新的数组长度,即移除指定值后有效元素的数量
     */
class Solution {
    public int removeElement(int[] nums, int val) {
        int low = 0;
        int high = nums.length -1;
        while (low <= high ) {
            if (nums[low] == val) {
                if(nums[high] != val) {
                    nums[low] = nums[high];
                }
                high--;
            } else {
                low++;
            } 
        }
        return low;
    }
}
  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值