1. 程式人生 > 其它 >leetCode80. 刪除有序陣列中的重複項 II

leetCode80. 刪除有序陣列中的重複項 II

leetCode80. 刪除有序陣列中的重複項 II

題目描述

 /**
     * 給你一個有序陣列 nums ,請你 原地 刪除重複出現的元素,使每個元素 最多出現兩次 ,
     * 返回刪除後陣列的新長度。
     *
     * 不要使用額外的陣列空間,你必須在 原地 修改輸入陣列
     * 並在使用 O(1) 額外空間的條件下完成。
     *
     */

思路分析

  1. 刪除陣列中重複的元素,要求陣列中最多隻能有兩個重複的元素,並且陣列是有序的
  2. 題目還要求原地刪除,因此不能開闢新的空間,必須充分利用原始陣列,因此處理後的陣列元素肯定少於等於原始陣列元素大小
  3. 定義兩個指標,一個指標用於遍歷原始陣列,另一個指標用於儲存不重複的元素,儲存的規則為不重複的元素不超過兩個,因此在遍歷原始陣列時,始終用當前遍歷到的元素和儲存的元素的前邊兩個位置上的元素作比較,判斷是否重複,如果重複,則繼續遍歷下一個,如果不重複則將當前元素移動到儲存元素指標的位置
  4. 原始碼見下

原始碼及分析

/**
     * 
     * @param nums 要刪除重複元素的陣列
     * @return 返回處理後的結果
     */
    public int removeDuplicates(int[] nums) {
        int len = nums.length;
        if (len <= 2){
            return len;
        }
        //定義兩個指標,fast用於遍歷陣列nums,slow為處理後的陣列下標
        int slow = 2, fast = 2;
        //從第三個元素開始遍歷
        while (fast < len){
            //因為題目要求最多重複兩個元素,因此需要判斷當前遍歷到元素和前邊第2個元素是否相等
            if (nums[slow - 2] != nums[fast]){
                //如果不相等說明沒有重複則改變位置,否則不改變
                nums[slow] = nums[fast];
                slow++;
            }
            //開始下一次遍歷
            fast++;
        }
        return slow;
    }