[アルゴリズム -- LeetCode] (026) 順序付き配列内の重複を削除する

ここに画像の説明を挿入

1. トピック

配列番号を昇順で指定した場合、各要素が 1 回だけ表示されるように、繰り返される要素を所定の位置で削除し、削除された配列の新しい長さを返してください。要素の相対的な順序は一貫している必要があります。次に、一意の要素の数を nums で返します。

nums の一意の要素の数が k であることを考慮すると、ソリューションが確実に合格できるようにするには、次のことを行う必要があります。

  • nums の最初の k 要素に、最初に nums に出現した順序で一意の要素が含まれるように、配列 nums を変更します。nums の残りの要素は、nums のサイズには影響しません。
  • kを返します。

判断基準:

システムは次のコードを使用してソリューションをテストします。

int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案

int k = removeDuplicates(nums); // 调用

assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
    assert nums[i] == expectedNums[i];
}

すべてのアサーションが合格すると、ソリューションは合格します。

例 1:

入力: nums = [1,1,2]
出力: 2、nums = [1,2,_]
説明: 関数は新しい長さ 2 を返す必要があり、元の配列 nums の最初の 2 つの要素は 1、2 に変更されます。配列内の新しい長さを超える要素は考慮する必要はありません。

例 2:

入力: nums = [0,0,1,1,1,2,2,3,3,4]
出力: 5、nums = [0,1,2,3,4]
説明: 関数は新しい長さ 5 を返す必要があり、元の配列 nums の最初の 5 つの要素は 0、1、2、3、4 に変更されます。配列内の新しい長さを超える要素は考慮する必要はありません。

トピックリンク: https://leetcode.cn/problems/remove-duplicates-from-sorted-array

2. 図

  • 配列に関する素朴な疑問ですが、まずは配列の基本をおさらいしてみましょう。Java では、配列は同じ型の要素を固定サイズで格納するために使用されます。メモリは連続した空間です。通常、配列要素にアクセスするには配列要素の添字を使用します。計算量は O(1) です。

  • したがって、配列の問題を解決するときは、速度を向上させるために配列の添字を使用することがよくあります。高速ポインタと低速ポインタは、配列の問題に対する一般的な解決策です。

  • この質問の意味は一文で簡潔に述べられており、順序付けられた配列内の重複を削除し、配列の重複していない要素の長さを返します。高速ポインタと低速ポインタを使用すると、繰り返しのない要素をすばやく見つけることができます。

3. Java サンプルコード

class Solution {
    
    
    public int removeDuplicates(int[] nums) {
    
    
        int n = nums.length;
        if (n <= 1) {
    
    
            return n;
        }
        int ans = 0;
        int slow = 0;
        int fast = 1;
        while (fast < n) {
    
    
            if (nums[slow] != nums[fast]) {
    
    
                nums[++slow] = nums[fast];
            }
            fast++;
        }
        ans = slow + 1;

        return ans;
    }
}

結果:
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/duoduo_11011/article/details/131835508