天天看點

【leetcode】每日精選題詳解之數組:啥?要移除我的元素?題目描述暴力解法快慢指針總結

嗨,大家好,我是袁廚(因為酷愛做飯,是以自己考取了廚師證)。之前一直看大家寫的部落格,學到了很多東西。然後最近萌生了自己寫的想法,将自己知道的分享給需要的同學。以後每天會為大家分享leetcode精選題目的各種題解,并且每周會整理一下該周刷的所有題目,及解題架構。大家搜尋【程式員愛做飯】關注我吧!
     同學們我最近有了一個長久的計劃,就是把leetcode題目整理出來,由淺入深,由簡到繁都整理出來是一個宏大的工程,是以我打算每天整理一到兩個經典題目,完成這一個流程我相信我們一定會收獲巨大的。如果想一起組隊刷題的哥們,我們可以一起在群裡打卡,共同進步。大家可以加我微信 tan45du_one或者掃描總結裡面的二維碼。

27.移除元素

  • 題目描述
  • 暴力解法
    • 做題思路
    • 題目代碼
  • 快慢指針
    • 做題思路
    • 題目代碼
  • 總結

題目描述

【leetcode】每日精選題詳解之數組:啥?要移除我的元素?題目描述暴力解法快慢指針總結

暴力解法

【leetcode】每日精選題詳解之數組:啥?要移除我的元素?題目描述暴力解法快慢指針總結

做題思路

該題目也算是簡單題目,适合新手來做,然後大家也不要看不起暴力解法,我們可以先寫出暴力解法,然後再思考其他方法,這對于我們的編碼能力有很大的幫助。我們來解析一下這個題目的做題思路,他的含義就是讓我們删除掉數組中的元素,然後将數組後面的元素跟上來。最後傳回删除掉元素的數組長度即可。比如數組長度為10,裡面有2個目标值,我們最後傳回的長度

為8,但是傳回的8個元素,需要排在數組的最前面。那麼暴力解法的話則就需要兩個for循環,一個用來找到删除,另一個用來更新數組。

【leetcode】每日精選題詳解之數組:啥?要移除我的元素?題目描述暴力解法快慢指針總結
【leetcode】每日精選題詳解之數組:啥?要移除我的元素?題目描述暴力解法快慢指針總結

總體思路就是這樣的,後面的會不斷往前覆寫。暴力解法也是不逾時的,實作也不算太簡單主要需要注意兩個地方,

(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;
    }
}
           

快慢指針

【leetcode】每日精選題詳解之數組:啥?要移除我的元素?題目描述暴力解法快慢指針總結

做題思路

快慢指針的做法比較有趣,隻需要一個for循環即可解決,時間複雜度為O(n),總體思路就是有兩個指針,前面一個後面一個,前面的用于搜尋需要删除的值,當遇到需要删除的值時,前指針直接跳過,後面的指針不動,當遇到正常值時,兩個指針都進行移動,并修改慢指針的值。最後隻需輸出慢指針的索引即可。

【leetcode】每日精選題詳解之數組:啥?要移除我的元素?題目描述暴力解法快慢指針總結

題目代碼

代碼也比較簡單大家可以參考一下

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;
    }
}
           

總結

總的來說這個題目還算不錯,算是打開了雙指針的大門,後面還會有很多雙指針的題目,大家快加我好友一起刷題吧。

【leetcode】每日精選題詳解之數組:啥?要移除我的元素?題目描述暴力解法快慢指針總結

作者:LeetCode

連結:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/

來源:力扣(LeetCode)

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。