圖解LeetCode #27 移除元素

給定一個數組 nums 和一個值 val,你需要原地移除所有數值等於 val 的元素,返回移除後數組的新長度。 不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 O(1) 額外空間的條件下完成。 元素的順序可以改變。你不需要考慮數組中超出新長度後面的元素。

LeetCode


示例 :

<code>給定 nums = [3,2,2,3], val = 3,

函數應該返回新的長度 2, 並且 nums 中的前兩個元素均為 2。

你不需要考慮數組中超出新長度後面的元素。/<code>

示例中給定的數組是int[] nums = {3,2,2,3}; 需要移除的值時int val = 3。


圖解LeetCode #27 移除元素


首先,需要遍歷整個數組。因此定義變量i,初始值為0,用紅色箭頭表示。


圖解LeetCode #27 移除元素


在遍歷數組的過程中,如果i所指向的元素,其值不等於需要移除的val的值,就將其值賦值給i前一個位置。


在此,需要定義一個變量k,用紫色箭頭表示。在[0...k)這個前閉後開的區間裡,保存的是所有當前遍歷過的其值不等於val的元素。


當i=0時,nums[0]=3,與val的值相同,不做考慮。


圖解LeetCode #27 移除元素


接著考慮下一個元素,i++。


圖解LeetCode #27 移除元素


當i=1時,nums[1]=2,與val的值不等。


圖解LeetCode #27 移除元素


此時,將nums[k]的值賦值為nums[1]的值,即nums[0]=2。


圖解LeetCode #27 移除元素


賦值完成後,k++。


圖解LeetCode #27 移除元素


接著考慮下一個元素,即i++。


圖解LeetCode #27 移除元素


此時,i=2,nums[2]=2,其值不等於val。


圖解LeetCode #27 移除元素


因此,需要將其賦值給nums[k],這時k=1,即nums[1]=2。


圖解LeetCode #27 移除元素


賦值完成,k++。


圖解LeetCode #27 移除元素


接著,考慮下一個元素,i++。這時,i=3,nums[3]=3,其值等於val的值,不做考慮。


圖解LeetCode #27 移除元素


接著,考慮下一個元素,i++。此時,i=4,超出了數組nums的索引,遍歷結束。


這時,k=2。在數組nums中,nums[0...2)這個前閉後開的區間裡,保存的就是所有非val的元素。


圖解LeetCode #27 移除元素


代碼示例:

<code>public int removeElement(int[] nums, int val) {
int k = 0;
for(int i = 0; i < nums.length; i++){
if (nums[i] != val){
nums[k++] = nums[i];
}
}
return k;
}/<code>


分享到:


相關文章: