LeetCode27:移除元素,超詳細,易懂
阿新 • • 發佈:2021-01-28
LeetCode27:移除元素,超詳細,易懂
題目描述
給你一個數組 nums 和一個值 val,你需要 原地 移除所有數值等於 val 的元素,並返回移除後陣列的新長度。
不要使用額外的陣列空間,你必須僅使用 O(1) 額外空間並 原地 修改輸入陣列。
元素的順序可以改變。你不需要考慮陣列中超出新長度後面的元素。
示例 1:
給定 nums = [3,2,2,3], val = 3,
函式應該返回新的長度 2, 並且 nums 中的前兩個元素均為 2。
你不需要考慮陣列中超出新長度後面的元素。
示例 2:
給定 nums = [0,1,2,2,3,0,4,2], val = 2,
注意這五個元素可為任意順序。
你不需要考慮陣列中超出新長度後面的元素。
解題方法
1.用到的方法removeElement(int[] nums, int val)
removeElement:刪除元素
val 表示需要刪除的元素
2.用到的方法,利用雙指標,來進行判斷
2.1 思想(雙指標)
左右兩指標交換值,一個是所去值,另一個是一般值,將兩者交換位置,最後使所有一般值排到前面,其位置還是原來的位置,陣列長度變短,輸出新的陣列即可
2.2 語言描述:
在陣列的開頭和結尾分別建立一個指標,可以先執行左指標,然後再執行右指標。左指標判斷其所在索引的值是否與val相同,若相同,則靜止不動,若不相同,則向右移動一位,直到相同靜止不動。右指標得找!=val的值,然後與左指標交換值,
程式碼實現
class Solution { public int removeElement(int[] nums, int val) { if(nums.length == 0 || nums == null) { return 0; } int temp =0; int l =0; int r = nums.length-1; while(l<r) { while(l<r && nums[l] != val) { l+=1; } while(l<r && nums[r] == val) { r-=1; } temp = nums[r]; nums[r] = nums[l]; nums[l] = temp; } return nums[l] == val?l:l+1; } }