1. 程式人生 > >Leetcode演算法Java全解答--80. 刪除排序陣列中的重複項 II

Leetcode演算法Java全解答--80. 刪除排序陣列中的重複項 II

Leetcode演算法Java全解答–80. 刪除排序陣列中的重複項 II

文章目錄

題目

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

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

為什麼返回數值是整數,但輸出的答案是陣列呢?

請注意,輸入陣列是以“引用”方式傳遞的,這意味著在函式裡修改輸入陣列對於呼叫者是可見的。

你可以想象內部操作如下:

// nums 是以“引用”方式傳遞的。也就是說,不對實參做任何拷貝
int len = removeDuplicates(nums);

// 在函式裡修改輸入陣列對於呼叫者是可見的。
// 根據你的函式返回的長度, 它會打印出陣列中該長度範圍內的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

示例:

示例 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 。

你不需要考慮陣列中超出新長度後面的元素。

想法

  1. 先編歷第一列的資料,找到那個比target大的資料,那麼target在這一項的前一行(遍歷1/10/23)

在關鍵行使用二分查詢

2.陳獨秀方法(better),把二維陣列轉換成一個一維陣列,直接上二分查詢

座標轉換:matrix[i][j] <=> matrix[a] 其中a=i*n+j, i=a/n, j=a%n;

結果

超過98%的測試案例

時間複雜度/空間複雜度:n/1

總結

程式碼

我的答案

    public int removeDuplicates(int[] nums) {
        if (nums.length < 3) {
            return nums.length;
        }

        int index1 = 1;
        int index2 = 1;
        int preNum = nums[0];
        int count = 1;

        while (index2 < nums.length) {
            nums[index1] = nums[index2];
            if (nums[index2] != preNum) {
                preNum = nums[index2];
                count = 1;
                index1++;
            } else {
                count++;
                if (count <= 2) {
                    index1++;
                }
            }
            index2++;

        }

        return index1;
    }

大佬們的答案

    public int removeDuplicates(int[] nums) {
        if (nums.length < 3) {
            return nums.length;
        }

        int index1 = 1;
        int index2 = 1;
        int preNum = nums[0];
        int count = 1;

        while (index2 < nums.length) {
            nums[index1] = nums[index2];
            if (nums[index2] != preNum) {
                preNum = nums[index2];
                count = 1;
                index1++;
            } else {
                count++;
                if (count <= 2) {
                    index1++;
                }
            }
            index2++;

        }

        return index1;
    }

測試用例

    @Test
    public void test080() {
        // 建立測試案例
        int[] arr1 = new int[] { 1, 1, 1, 2, 2, 3 };
        int[] arr2 = new int[] { 0, 0, 1, 1, 1, 1, 2, 3, 3 };

        // 測試案例期望值
        int expResult1 = 5;
        int expResult2 = 7;

        // 執行方法
        Solution080 solution080 = new Solution080();
        int result1 = solution080.removeDuplicates(arr1);
        int result2 = solution080.removeDuplicates(arr2);

        // 判斷期望值與實際值
        Assert.assertEquals(expResult1, result1);
        Assert.assertEquals(expResult2, result2);
    }
   


其他

程式碼託管碼雲地址:https://gitee.com/lizhaoandroid/LeetCodeAll.git

檢視其他內容可以點選專欄或者我的部落格哈:https://blog.csdn.net/cmqwan

“大佬們的答案” 標籤來自leetcode,侵權請聯絡我進行刪改

如有疑問請聯絡,聯絡方式:QQ3060507060