サンダーボルト

相手モンスターを全て破壊する。

LeetCode Study : 26. Remove Duplicates from Sorted Array

問題

Given a sorted array nums, remove the duplicates in-place such that each element appear only once and return the new length.

Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.

Example 1:

Given nums = [1,1,2],
Your function should return length = 2, with the first two elements
of nums being 1 and 2 respectively.
It doesn't matter what you leave beyond the returned length.

Example 2:

Given nums = [0,0,1,1,1,2,2,3,3,4],
Your function should return length = 5, with the first five elements
of nums being modified to 0, 1, 2, 3, and 4 respectively.
It doesn't matter what values are set beyond the returned length.

https://leetcode.com/problems/remove-duplicates-from-sorted-array/

自分の解答

public int removeDuplicates(int[] nums) {
    if (nums.length <= 1) {
        return nums.length;
    }
    int number = nums[0];
    int pointerIndex = 1;
    for (int i = 1; i < nums.length; i++) {
        if (number < nums[i]) {
            if (pointerIndex != i) {
                nums[pointerIndex] = nums[i];
            }
            number = nums[i];
            pointerIndex++;
        }
    }
    return pointerIndex;
}

コード理解

別解

public int removeDuplicates(int[] nums) {
    if (nums.length == 0) return 0;
    int i = 0;
    for (int j = 1; j < nums.length; j++) {
        if (nums[j] != nums[i]) {
            i++;
            nums[i] = nums[j];
        }
    }
    return i + 1;
}

Time :  O(n) / Space :  O(1)

自分のコードのnumber変数、実はいらなかった。そのかわりにnums[pointerIndex-0]でいけた。 ただこれ気づくのは難しいなぁ。変数作って、実際それが必要かは再度コードを書いてから考えた方が良いのかも。 解答は自分のソースコードで言う所のif (pointerIndex != i) {の判定が無い分、[0,1,2]のときとかは無駄に数を上書きしていて、そこは自分のコードの良いところ。

今後のための考え方

  • その変数は本当に必要か?コードを書き終わってから再度考えてみてはいかがだろうか