アルゴリズム 1 日目: ソートされた配列内の重複を削除する

LeetCode 質問 26:

順序付けられた配列番号が指定された場合、各要素が 1 回だけ表示されるように、繰り返される要素を所定の位置で削除し、削除された配列の新しい長さを返してください。
余分な配列スペースを使用しないでください。入力配列をインプレースで変更し、O(1) の余分なスペースを使用して変更する必要があります。

説明:
戻り値は整数ですが、出力の答えは配列であるのはなぜですか? 入力配列は「参照」によって渡されることに注意してください。これは、関数内の入力配列の変更が呼び出し側に見えることを意味します。
内部動作は次のように想像できます。

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
    
    
    print(nums[i]);
}

例 1:

输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

例 2:

输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

一連の考え

  • 順序付き配列: 繰り返される要素が隣接した位置にあります
  • 最終的な配列の長さは元の配列以下です
  • 「インプレース」条件を満たす必要があるため、ブルート フォース コピーのために追加の配列を作成する必要はありません。
  • 元の配列の重複した位置を上書きするだけで済みます

解決方法:
ダブル ポインターによる解決: 最初のポインターは、元の配列をスキャンしてさまざまな要素を見つけるために使用され、2 番目のポインターは、最終結果の配列内のすべての要素が異なる要素になるようにさまざまな要素の位置を変更するために使用されます
。 : O(n)
空間の複雑さ: O(1)

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

ダブルポインター ソリューションのその他のアプリケーション シナリオ: 配列内で連続配列を取得することは、二分法の考え方に似ています。ダブル ポインター ソリューションは、トラバーサルにさまざまなアイデアをもたらします


上記は著者の個人的な見解を表したものにすぎません。ご質問がある場合は、ご容赦いただき、時間内に著者にお知らせください。質問の種類は leetcode から選択されます。参照のみです。

おすすめ

転載: blog.csdn.net/qq_52696089/article/details/120461270