1. 程式人生 > >LeetCode刪除陣列元素

LeetCode刪除陣列元素

本文實現從陣列中刪除元素,提供時間複雜度為O(n),空間複雜度為O(1)的Java版本的基本模板,在模板上修改,可以解決LeetCode中陣列刪除元素相關的問題,如:27. Remove Element(刪除元素),26. Remove Duplicates from Sorted Array(刪除排序陣列中的重複項),80. Remove Duplicates from Sorted Array II(刪除排序陣列中的重複項II),283. Move Zeroes(移動零元素)。

陣列中刪除元素這個操作應該不會陌生,但是回答怎麼刪除的時候確實還是有些問題需要考慮清楚的,比如:

①如何定義刪除?從陣列中直接去除?還是放在陣列的末尾位置?

②剩餘元素的排列是否保證原有的相對順序?

③是否有空間複雜度的要求?

今天在做27. Remove Element(刪除元素)這個題的時候,我發現完全可以套用我之前在做LeetCode283. Move Zeroes時的方法,方法在之前的部落格裡面也有較為詳細的介紹。下面直接上程式碼:

class Solution {
    public void moveZeroes(int[] nums) {
        int index = 0;
        for (int i = 0; i < nums.length; i++){
            if (nums[i] != 0){
                nums[index++] = nums[i];
            }
        }
        for (int i = index; i < nums.length; i++){
            nums[i] = 0;
        }
    }
}

其中這段程式碼是完全可以複用的:

public void move(int[] nums) {
        int index = 0;
        for (int i = 0; i < nums.length; i++){
            if (){
                nums[index++] = nums[i];
            }
        }
}

27. Remove Element

第27題在nums陣列中刪除val的時候,只需要改變if的判斷條件,如果不等於val的時候,將他新增進入陣列,否則就跳過了,就是刪除了。程式碼如下:

class Solution {
    public int removeElement(int[] nums, int val) {
        int index = 0;
        for(int i=0;i<nums.length;i++){
            if(nums[i]!=val){
                nums[index++] = nums[i];
            }
        }
        return index;
    }
}

26. Remove Duplicates from Sorted Array

這個題需要刪除陣列中重複的元素,由於已經是有序的陣列,所以重複的元素處在陣列中相鄰的位置。要刪除重複的元素,只需要更改判斷條件,相鄰元素不等的情況下,講元素新增進來,即可完成刪除操作。程式碼如下:

class Solution {
    public int removeDuplicates(int[] nums) {
        int index = 1;
        for(int i=1;i<nums.length;i++){
            if(nums[i]!=nums[i-1]){
                nums[index++] = nums[i];
            }
        }
        return index;
    }
}

80. Remove Duplicates from Sorted Array II

這個題給定一個排序陣列,刪除重複出現的元素,使得每個元素最多出現兩次,返回移除後陣列的新長度。

這個題需要在26. Remove Duplicates from Sorted Array的基礎上加上計數的功能,需要引入一個變數來記錄元素出現的次數。如果陣列中後一個元素等於前一個元素,並且這種情況(元素相等的情況)是第一次出現的時候,把這兩個元素新增進去最終的陣列,否則跳過去完成刪除。程式碼如下:

class Solution {
    public int removeDuplicates(int[] nums) {
        int n = nums.length;
        if (n <= 2) return n;
        int repeat = 0, index = 1;
        for (int i = 1; i < n; ++i) {
            if (nums[i] == nums[i-1] && repeat < 1) {
                nums[index++] = nums[i];
                repeat++;
            }
            else if (nums[i] > nums[i-1]) {
                nums[index++] = nums[i];
                repeat = 0;
            }
        }
        return index;
    }
}