1. 程式人生 > 其它 >LeetCode27:移除元素,超詳細,易懂

LeetCode27:移除元素,超詳細,易懂

技術標籤:指標資料結構演算法java

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,

函式應該返回新的長度 5, 並且 nums 中的前五個元素為 0, 1, 3, 0, 4。
注意這五個元素可為任意順序。
你不需要考慮陣列中超出新長度後面的元素。

解題方法

1.用到的方法removeElement(int[] nums, int val)
removeElement:刪除元素
val 表示需要刪除的元素
2.用到的方法,利用雙指標,來進行判斷
2.1 思想(雙指標)
左右兩指標交換值,一個是所去值,另一個是一般值,將兩者交換位置,最後使所有一般值排到前面,其位置還是原來的位置,陣列長度變短,輸出新的陣列即可
2.2 語言描述:
在陣列的開頭和結尾分別建立一個指標,可以先執行左指標,然後再執行右指標。左指標判斷其所在索引的值是否與val相同,若相同,則靜止不動,若不相同,則向右移動一位,直到相同靜止不動。右指標得找!=val的值,然後與左指標交換值,

因為l是從0開始,所以最後如果nums[l]==val的話,輸出l即可,不相等的話,就使l+1

程式碼實現

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;
    }
}