力扣27 移除元素

题目:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
 
数组理论基础:
数组(Array)是有序的元素序列。
1 2 3 4 5
删除元素3后,真实并非
1 2   4 5

而是

1 2 4 5  
 
库函数使用:erase 时间复杂度O(n)
 
暴力实现:时间O(n2)  空间O(1)
class Solution {
    public int removeElement(int[] nums, int val) {
        int length=nums.length;
        for(int i=0;i<length;i++){
            if(nums[i]==val){
                for(int j=i+1;j<length;j++){
                    nums[j-1]=nums[j];//往前覆盖
                }
                i--;
                length--;//数组大小减1
            }
        }
        return length;
    }
}
双指针实现:时间O(n) 空间O(1)
快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
慢指针:指向新数组下标的位置
fast            
0 1 3 2 3 4 5
slow            
以该数组为例:fast-->f,slow-->s,起始均为0,演示几次循环过程
  (1) f=0, nums[f]=nums[0]!=3 --> nums[s]=nums[0]=0, s-->1
  (2) f=1, nums[f]=nums[1]!=3 --> nums[s]=nums[1]=1, s-->2
  (3) f=2, nums[f]=nums[2]=3
  (4) f=3, nums[f]=nums[3]!=3 --> nums[s]=nums[2]=nums[f]=2, s-->3
  (5) f=4, nums[f]=nums[4]=3
  (6) f=5, nums[f]=nums[5]!=3 --> nums[s]=nums[3]=nums[f]=4, s-->4
  (7) f=6, nums[f]=nums[6]!=3 --> nums[s]=nums[4]=nums[f]=5, s-->5
  (8) f=7,出循环,返回数组大小=slow=5
可以想象成:slow是个碗边,fast是个铲子,fast往前推土的时候,发现3的时候就铲掉,然后把其他土往碗里扔,slow就是那个碗的边,一直保持一个位子给下一堆土
class Solution {
    public int removeElement(int[] nums, int val) {
        int slow=0;
        for(int fast=0;fast<nums.length;fast++){
            if(nums[fast]!=val){
                nums[slow]=nums[fast];
                slow++;
            }
        }
        return slow;
    }
}

 

 
posted @ 2022-11-06 13:58  壹索007  阅读(16)  评论(0编辑  收藏  举报