アルゴリズム: 配列内の val のすべての要素を削除します ---double pointer[2]

ここに画像の説明を挿入します


1. トピック:

配列 nums と値 val が与えられた場合、 val に等しい値を持つ要素をすべて削除し、削除後の配列の新しい長さを返す必要があります。

余分な配列スペースを使用しないでください。O(1) の余分なスペースのみを使用し、入力配列を適切に変更する必要があります。

要素の順序は変更できます。新しい長さを超える配列内の要素を考慮する必要はありません。


2.分析機能:

  • 質問要件: 現場で削除する
  • val のすべての要素を削除してから、 を削除します结果数组一定比原数组的长度更短所定の位置での削除のリクエスト> 我们可以把结果数组直接写在原数组上、結果の配列は val に等しくない要素で構成され、位置 0 から結果の配列として特定の位置まで始まります。元の配列は 0 から配列全体の長さまで走査する必要があります。> ダブルポインターを使用します。
  • 結果配列のポインタ: [0, left]。結果配列の目的は結果を収集することです。結果配列は左から順に追加されます。
  • 元の配列のポインター: [0, right]、right <= 元の配列の長さ、および right は、元の配列の現在の要素が val に等しくなく、収集できるかどうかを示すために使用されます。

3. コード:

       public int removeElement(int[] nums, int val) {
    
    
        int n = nums.length;
        int left = 0;
        for (int right = 0; right < n; right++) {
    
    
            if (nums[right] != val) {
    
    
                nums[left] = nums[right];
                left++;
            }
        }
        return left;
    }

4. 複雑さの分析:

  • 時間計算量: O(n)、n はシーケンスの長さです。シーケンスを最大 2 回繰り返すだけで済みます。

  • 空間複雑度: O(1)。必要なのは、複数の変数を保存するための一定のスペースだけです。


5. 概要:

この質問は比較的単純です。理解する必要があります。質問の意味: その場で削除、その場 ==> 結果は元の配列にのみ出力できます。削除すると、結果の配列の長さは短くなります。元の配列よりも。結果配列を 0 から使用して left++ を開始して収集し、右ポインタを使用して元の配列を 0 から走査して、現在の要素を収集できるかどうかを判断します。

==> 条件を満たすすべての要素を収集することが目的です。




この記事が役に立った場合は、忘れずに Yile に「いいね!」を押してください。ありがとうございます。

おすすめ

転載: blog.csdn.net/weixin_45630258/article/details/132689237