嗨,大家好,我是袁廚(因為酷愛做飯,所以自己考取了廚師證),之前一直看大家寫的博客,學到了很多東西,然后最近萌生了自己寫的想法,將自己知道的分享給需要的同學,以后每天會為大家分享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)
著作權歸作者所有,商業轉載請聯系作者獲得授權,非商業轉載請注明出處,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/173770.html
標籤:java
上一篇:黑馬程式員第一天
