题目地址(27. 移除元素)

https://leetcode-cn.com/problems/remove-element/

题目描述

  1. 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
  2. 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
  3. 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
  4. 说明:
  5. 为什么返回数值是整数,但输出的答案是数组呢?
  6. 请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
  7. 你可以想象内部操作如下:
  8. // nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
  9. int len = removeElement(nums, val);
  10. // 在函数里修改输入数组对于调用者是可见的。
  11. // 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
  12. for (int i = 0; i < len; i++) {
  13. print(nums[i]);
  14. }
  15. 示例 1
  16. 输入:nums = [3,2,2,3], val = 3
  17. 输出:2, nums = [2,2]
  18. 解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] nums = [2,2,0,0],也会被视作正确答案。
  19. 示例 2
  20. 输入:nums = [0,1,2,2,3,0,4,2], val = 2
  21. 输出:5, nums = [0,1,4,0,3]
  22. 解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。
  23. 提示:
  24. 0 <= nums.length <= 100
  25. 0 <= nums[i] <= 50
  26. 0 <= val <= 100

前置知识


公司

  • 暂无

思路

使用暴力解法的时候如果写成

  1. for (int j = i; j < size; j++) {
  2. nums[j] = nums[j+1];
  3. }

就会出现数组下标越界的错误 有点搞不明白 希望二刷的时候可以解决
因为j=i的话j的值循环到后面就会超过数组的长度
image.png
最好的解法是使用快慢指针的方法 让快指针遍历 慢指针记录符合条件的数字
008eGmZEly1gntrds6r59g30du09mnpd.gif

关键点

  • 使用快慢指针的方法 双指针法(快慢指针法)在数组和链表的操作中是非常常见的

代码

  • 语言支持:Java

Java Code:

  1. class Solution {
  2. public int removeElement(int[] nums, int val) {
  3. int left = 0;
  4. //右指针要遍历全部数组
  5. for (int right = 0; right <nums.length ; right++) {
  6. //如果右指针指向的数字不等于val 就让左指针=右指针的数字并++
  7. if (nums[right] != val) {
  8. nums[left++] = nums[right];
  9. }
  10. }
  11. return left;
  12. }
  13. }
  • 暴力解法
    1. class Solution {
    2. public int removeElement(int[] nums, int val) {
    3. int size = nums.length;
    4. for (int i = 0; i < size; i++) {
    5. if (nums[i] == val) {
    6. for (int j = i+1; j < size; j++) {
    7. nums[j-1] = nums[j];
    8. }
    9. i--;
    10. size--;
    11. }
    12. }
    13. return size;
    14. }
    15. }

复杂度分析

令 n 为数组长度。

  • 时间复杂度:27. 移除元素(2) - 图3#card=math&code=O%28n%29&id=F4Tc6)
  • 空间复杂度:27. 移除元素(2) - 图4#card=math&code=O%28n%29&id=zFvcB)