移除元素
- 一、题目
- 二、思路
- 三、方法
- 1.暴力解法
- 2.双指针法
- 定义
- 快指针和慢指针
- 代码展示
 
 
- 三、力扣刷题
- 1.删除排序数组中的重复项
 
一、题目
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
二、思路
数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
三、方法
1.暴力解法
两层for循环,一个for循环遍历数组元素 ,第二个for循环更新数组。但暴力解法的时间复杂度是O(n^2)。
var removeElement = function(nums, val) {
    let size = nums.length;    
    for (let i = 0; i < size; i++) {       
         if (nums[i] === val) { // 发现需要移除的元素           
               for (let j = i + 1; j < size; j++) {                
                   nums[j - 1] = nums[j]; // 将数组集体向前移动一位        
         }         
               i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位           
               size--; // 此时数组的大小-1       
              }    
           } 
         return size;
     };
2.双指针法
定义
通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
快指针和慢指针
快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
 慢指针:指向更新 新数组下标的位置
代码展示
//时间复杂度:O(n)
//空间复杂度:O(1)
  var removeElement = (nums, val) => {    
     //k是慢指针,i是快指针
     let k = 0;    
     for(let i = 0;i < nums.length;i++){                      
        if(nums[i] != val){            
            nums[k++] = nums[i]       
       }  
   }    return k;
};
三、力扣刷题
1.删除排序数组中的重复项

 这道题不同的地方在于不再是给出一个目标值查找重复项进行删除,而是只要重复了的都要删除重复项,那么同样地,我们可以用双指针法,用快指针定义不包含重复元素的新数组,慢指针用来更新新数组的长度,只需要更改一下慢指针向后移动的条件就行了。因为条件是不重复的元素,所以只要快指针移动时后面一个元素跟前一个元素不重复,那么慢指针就可以更新移动。
 var removeDuplicates = function(nums) {   
     //如果数组长度为0则直接返回0,不需要用指针移动
     if(nums.length===0){       
        return 0   
     }
     //   
     let slow =0;   
     for(let fast=0;fast<nums.length;fast++){        
          if(nums[fast]!== nums[fast-1]){                 
             nums[slow++]=nums[fast]     
        }  
      }   
      return slow
  };
移除元素的其他力扣题解会持续更新,关注不迷路哦



















