高速ポインターと低速ポインターが LeetCode 配列を解決して要素を削除する

タイトル:

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

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

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

説明します:

返される値は整数であるのに、出力される答えが配列であるのはなぜですか?

入力配列は「参照渡し」で渡されることに注意してください。これは、関数内の入力配列への変更が呼び出し元に表示されることを意味します。

内部操作は次のように想像できます。

// nums は「参照」によって渡されます。つまり、実際のパラメーターのコピーを作成しないでください
int len = removeElement(nums, val);

// 関数内の入力配列への変更は、呼び出し元に表示されます。
// 関数によって返される長さに応じて、その長さ内の配列内のすべての要素が出力されます。
for (int i = 0; i < len; i++) { print(nums[i]); }

例 1:

入力: nums = [3,2,2,3]、val = 3
出力: 2、nums = [2,2]
説明: 関数は新しい長さ 2 を返す必要があり、nums の最初の 2 つの要素は両方とも 2 です。新しい長さを超える配列内の要素を考慮する必要はありません。たとえば、関数によって返される新しい長さは 2 で、nums = [2,2,3,3] または nums = [2,2,0,0] も正解と見なされます。
例 2:

入力: nums = [0,1,2,2,3,0,4,2], val = 2
出力: 5, nums = [0,1,4,0​​,3]
説明: 関数は新しい長さ 5、nums の最初の 5 つの要素は 0、1、3、0、4 です。これら 5 つの要素の順序は任意であることに注意してください。新しい長さを超える配列内の要素を考慮する必要はありません。

ヒント:

0 <= nums.length <= 100
0 <= nums[i] <= 50
0 <= val <= 100

アイデア:

この質問では、新しいスペースを開けず、変更のみを元の配列で行う必要があります. アイデアは、配列の先頭を指す 2 つのポインターを定義することです. 高速ポインター Fast は、配列をすばやくトラバースする役割を果たします. , スロー ポインタ Slow は、val と等しくない値を配列内に保持する責任があります. 上書きします. スローは、割り当てられるたびに 1 を追加し、次の位置を指します.

		nums = [1,2,2,2,3,4,5,2,2]
		val = int(input("请输入目标值:"))
		Fast,Slow = 0,0
        for Fast in range(len(nums)):
            if nums[Fast] != val:
                nums[Slow] = nums[Fast]
                Slow += 1
        print(Slow)
        print(nums)

#Output
#请输入目标值:2
#4
#[1, 3, 4, 5, 3, 4, 5, 2, 2]

おすすめ

転載: blog.csdn.net/chenjh027/article/details/128171043