給定一個數(shù)組 nums 和一個值 val,你需要原地移除所有數(shù)值等于 val 的元素,返回移除后數(shù)組的新長度。
不要使用額外的數(shù)組空間,你必須在原地修改輸入數(shù)組并在使用 O(1) 額外空間的條件下完成。
元素的順序可以改變。你不需要考慮數(shù)組中超出新長度后面的元素。
示例 1:
給定 nums = [3,2,2,3], val = 3,
函數(shù)應(yīng)該返回新的長度 2, 并且 nums 中的前兩個元素均為 2。
你不需要考慮數(shù)組中超出新長度后面的元素。
示例 2:
給定 nums = [0,1,2,2,3,0,4,2], val = 2,
函數(shù)應(yīng)該返回新的長度 5, 并且 nums 中的前五個元素為 0, 1, 3, 0, 4。
注意這五個元素可為任意順序。
你不需要考慮數(shù)組中超出新長度后面的元素。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/remove-element
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
這道題,我想了很久,想不出怎么解,當(dāng)一看到不能使用額外的數(shù)組空間,感覺就慫了很多,然后看了一下官方的解答,發(fā)現(xiàn),這也太秀了吧,我怎么沒想到呢~
-
思路:
用一個數(shù)組來解釋說明 int[] nums = {0,1,2,2,3,0,4,2}; val = 2
用兩個指針來記錄,慢指針 i 快指針 j
遍歷數(shù)組nums, 當(dāng)nums[ j ] != val時,就執(zhí)行 nums[ i ] = nums[ j ],這里是什么意思呢,其實就是重新賦值一下數(shù)組元素,當(dāng)nums[ j ] == val 時,就跳開這個nums[ j ],執(zhí)行下一輪循環(huán),值到 j 角標(biāo)到達(dá) 數(shù)組末尾 ,結(jié)束循環(huán);執(zhí)行過程:
當(dāng) j 角標(biāo)為0 時, nums[ j ] 值為 0,不等于 val 值 2,即 nums[ j ] 值 0 再賦值給自己 nums[ i ],此時 i = 0
當(dāng) j 角標(biāo)為1 時, nums[ j ] 值為 1,不等于 val 值 2,即 nums[ j ] 值 1 再賦值給自己 nums[ i ],此時 i = 1
當(dāng) j 角標(biāo)為2 時, nums[ j ] 值為 2,等于 val 值 2,則執(zhí)行下一個循環(huán),此時 i = 2
當(dāng) j 角標(biāo)為3 時, nums[ j ] 值為 2,等于 val 值 2,則執(zhí)行下一個循環(huán),此時 i = 2 , 但 j 已經(jīng)是3了
當(dāng) j 角標(biāo)為4 時, nums[ j ] 值為 3,不等于 val 值 2,即 nums[ j ] 值 3 賦值給 nums[ i ],此時 i = 2
原數(shù)組元素 int[] nums = {0,1,2,2,3,0,4,2}; val = 2
到目前的步驟后數(shù)組內(nèi)元素為就是int[] nums = {0,1,3,2,3,0,4,2}; val = 2
就是后面的元素替換前面的元素, i 就是要返回的長度,為什么i不用加1呢,因為在最后一次執(zhí)行邏輯中,已經(jīng)執(zhí)行了i++
public static int removeElement(int[] nums, int val) {
int i = 0;
for (int j = 0; j < nums.length; j++) {
if (nums[j] != val) {
nums[i] = nums[j];
i++;
}
}
return i;
}