每日一題——刪除排序數組中的重複項 II

菜雞每日一題系列打卡80

每天一道算法題目 

小夥伴們一起留言打卡

堅持就是勝利,我們一起努力!

題目描述(引自LeetCode)

給定一個排序數組,你需要在原地刪除重複出現的元素,使得每個元素最多出現兩次,返回移除後數組的新長度。

不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 O(1) 額外空間的條件下完成。

示例 1:


給定 nums = [1,1,1,2,2,3],


函數應返回新長度 length = 5, 並且原數組的前五個元素被修改爲 1, 1, 2, 2, 3 。


你不需要考慮數組中超出新長度後面的元素。
示例 2:


給定 nums = [0,0,1,1,1,1,2,3,3],


函數應返回新長度 length = 7, 並且原數組的前五個元素被修改爲 0, 0, 1, 1, 2, 3, 3 。
你不需要考慮數組中超出新長度後面的元素。

題目分析

這是每日一題——刪除排序數組中的重複項的變形題目,所不同的是,之前的題目要求每個元素只出現一次,而本題要求每個元素出現不超過兩次

因此,這兩道題處理的方式其實並無本質區別,只是本題的處理要稍許複雜一些,需要引入額外的計數變量,記錄當前元素的出現次數。

話不多說,上代碼!

代碼實現

class Solution {


    public int removeDuplicates(int[] nums) {
        // 特殊情況處理
        if (nums == null || nums.length == 0) return 0;
        // 計數變量,用於記錄當前元素出現次數
        int count = 1;
        // 結果變量
        int flag = 1;
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] == nums[i - 1]) {
                // 截至目前,當前元素出現不超過2次
                if (++count <= 2) nums[flag++] = nums[i];
            } else {
                // 重置計數變量
                count = 1;
                nums[flag++] = nums[i];
            }
        }
        // 返回結果
        return flag;
    }


}

代碼分析

對代碼進行分析,程序對數組進行了一次遍歷,因此,時間複雜度爲O(n);而就空間而言,僅僅使用了常數級別的額外空間,因此,空間複雜度爲O(1)。

執行結果

相關鏈接

每日一題——刪除排序數組中的重複項

學習 | 工作 | 分享

????長按關注“有理想的菜雞

只有你想不到,沒有你學不到

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章