嗨,大家好,我是袁廚(因為酷愛做飯,是以自己考取了廚師證)。之前一直看大家寫的部落格,學到了很多東西。然後最近萌生了自己寫的想法,将自己知道的分享給需要的同學。以後每天會為大家分享leetcode精選題目的各種題解,并且每周會整理一下該周刷的所有題目,及解題架構。大家搜尋【程式員愛做飯】關注我吧!
同學們我最近有了一個長久的計劃,就是把leetcode題目整理出來,由淺入深,由簡到繁都整理出來是一個宏大的工程,是以我打算每天整理一到兩個經典題目,完成這一個流程我相信我們一定會收獲巨大的。如果想一起組隊刷題的哥們,我們可以一起在群裡打卡,共同進步。大家可以加我微信 tan45du_one或者掃描總結裡面的二維碼。
27.移除元素
- 題目描述
- 暴力解法
- 做題思路
- 題目代碼
- 快慢指針
- 做題思路
- 題目代碼
- 總結
題目描述
暴力解法
做題思路
該題目也算是簡單題目,适合新手來做,然後大家也不要看不起暴力解法,我們可以先寫出暴力解法,然後再思考其他方法,這對于我們的編碼能力有很大的幫助。我們來解析一下這個題目的做題思路,他的含義就是讓我們删除掉數組中的元素,然後将數組後面的元素跟上來。最後傳回删除掉元素的數組長度即可。比如數組長度為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;
}
}
總結
總的來說這個題目還算不錯,算是打開了雙指針的大門,後面還會有很多雙指針的題目,大家快加我好友一起刷題吧。
作者:LeetCode
連結:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。