【leetcode】每日精选题详解之数组:啥?要移除我的元素?

        嗨,大家好,我是袁厨(因为酷爱做饭,所以自己考取了厨师证)。之前一直看大家写的博客,学到了很多东西。然后最近萌生了自己写的想法,将自己知道的分享给需要的同学。以后每天会为大家分享leetcode精选题目的各种题解和Python, JS, JQ, CSS, PHP, JAVA的一些小Demo。请大家关注我,一起交流学习吧。


     同学们我最近有了一个长久的计划,就是把leetcode题目整理出来,由浅入深,由简到繁都整理出来是一个宏大的工程,所以我打算每天整理一到两个经典题目,完成这一个流程我相信我们一定会收获巨大的。如果想一起组队刷题的哥们,我们可以一起在群里打卡,共同进步。大家可以加我微信 tan45du_one或者扫描总结里面的二维码。

题目描述

在这里插入图片描述


暴力解法

在这里插入图片描述

做题思路

该题目也算是简单题目,适合新手来做,然后大家也不要看不起暴力解法,我们可以先写出暴力解法,然后再思考其他方法,这对于我们的编码能力有很大的帮助。我们来解析一下这个题目的做题思路,他的含义就是让我们删除掉数组中的元素,然后将数组后面的元素跟上来。最后返回删除掉元素的数组长度即可。比如数组长度为10,里面有2个目标值,我们最后返回的长度
为8,但是返回的8个元素,需要排在数组的最前面。那么暴力解法的话则就需要两个for循环,一个用来找到删除,另一个用来更新数组。
在这里插入图片描述
在这里插入图片描述
总体思路就是这样的,后面的会不断往前覆盖。暴力解法也是不超时的,实现也不算太简单主要需要注意两个地方,
(1)需要先定义变量len获取数组长度,因为后面我们的返回的数组长度是改变的,所以不可以用nums.length作为上界
(2)我们每找到一个需要删除的值的时候,需要i- - ,防止出现多个需要删除的值在一起的情况,然后漏删。

题目代码

代码也比较简单

class Solution {
    
    
    public int removeElement(int[] nums, int val) {
    
    
        //特殊情况需要注意
        if(nums.length == 0){
    
    
            return 0;
        }
        //获取数组长度,作为for循环的上界
        int len = nums.length;
        for(int i = 0; i < len ; i++){
    
    
            //找到需要删除的元素
            if(nums[i]==val){
    
     
               //覆盖需要删除的元素               
                for(int j = i+1 ; j < len ; j++){
    
    
                    nums[j-1] = nums[j];
                }
                //保留当前索引,防止漏删
                i--;
                //缩小需要返回的长度
                len--;                
            }
        }
        return len;
    }
}

快慢指针

在这里插入图片描述

做题思路

快慢指针的做法比较有趣,只需要一个for循环即可解决,时间复杂度为O(n),总体思路就是有两个指针,前面一个后面一个,前面的用于搜索需要删除的值,当遇到需要删除的值时,前指针直接跳过,后面的指针不动,当遇到正常值时,两个指针都进行移动,并修改慢指针的值。最后只需输出慢指针的索引即可。
在这里插入图片描述

题目代码

代码也比较简单大家可以参考一下

class Solution {
    
    
    public int removeElement(int[] nums, int val) {
    
    
    //特殊情况
      if(nums==null){
    
    
          return 0;
      }     
      int j = 0;//慢指针,i代表快指针
      for(int i = 0;i<nums.length;i++){
    
    
         //正常情况直接赋值给i          
          if(nums[i]!=val){
    
    
              nums[j]=nums[i];
              j++;
          }
          //如果为需要删除的值时,则快指针移动,慢指针不动。
      }
       return j;
    }
}

总结

总的来说这个题目还算不错,算是打开了双指针的大门,后面还会有很多双指针的题目,大家快加我好友一起刷题吧。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201013143801804.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RhbjQ1ZHVfeXVhbg==,size_16,color_FFFFFF,t_70#pic_cente

作者:LeetCode
链接:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/tan45du_yuan/article/details/109046609
今日推荐