Re-translate the Japanese version (#1871)

* Retranslate Japanese docs with GPT-5.4

* Retranslate Japanese code with GPT-5.4
This commit is contained in:
Yudong Jin
2026-03-30 07:30:15 +08:00
committed by GitHub
parent fe6443235b
commit d7b2277d2b
1444 changed files with 83312 additions and 8363 deletions
+23 -23
View File
@@ -1,39 +1,39 @@
# 二分探索の境界
## 左境界を見つける
## 左境界を探す
!!! question
重複要素を含む可能性がある長さ$n$のソート済み配列`nums`が与えられ、最も左の要素`target`のインデックスを返してください。要素が配列に存在しない場合は、$-1$を返してください
長さ $n$ のソート済み配列 `nums` が与えられ、その中には重複要素が含まれる可能性があります。配列内で最も左にある要素 `target` のインデックスを返してください。配列にこの要素が含まれない場合は、$-1$ を返します
挿入位置の二分探索方法を思い出すと、探索完了後、インデックス$i$は`target`の最も左の出現を指します。したがって、**挿入位置の探索は本質的に最も左の`target`のインデックスを見つけることと同じです**。
二分探索で挿入位置を求める方法を思い出すと、探索完了後に $i$ は最も左にある `target` を指します。**したがって、挿入位置を探すことの本質は、最も左にある `target` のインデックスを探すことです**。
挿入位置を見つける関数を使用して`target`の左境界を見つけることができます。配列に`target`が含まれていない可能性があることに注意してください。これは以下の2つの結果につながる可能性があります
挿入位置を探す関数を使って左端境界を求めることを考えます。なお、配列に `target` が含まれない場合があり、そのときは次の 2 つの結果が起こりえます
- 挿入位置のインデックス$i$が範囲外です
- 要素`nums[i]``target`と等しくありません
- 挿入位置のインデックス $i$ が範囲外になる
- 要素 `nums[i]``target` と等しくない
これらの場合、単に$-1$を返します。コードは以下のりです:
上の 2 つの状況に当てはまる場合は、直接 $-1$ を返せば十分です。コードは以下のとおりです:
```src
[file]{binary_search_edge}-[class]{}-[func]{binary_search_left_edge}
```
## 右境界を見つける
## 右境界を探す
`target`の最も右の出現をどのように見つけるでしょうか最も直接的な方法は、`nums[m] == target`の場合に探索境界を調整する方法を変更して、従来の二分探索ロジックを修正することです。コードはここでは省略されています。興味がある場合は、自分でコードを実装してみてください。
では、最も右にある `target`どのように探せるでしょうか最も直接的な方法はコードを修正し`nums[m] == target` の場合のポインタの縮小操作を置き換えることです。ここではコードを省略するので、興味があれば自分で実装してみてください。
以下では、さらに2つの巧妙な方法を紹介します。
ここでは、より巧妙な 2 つの方法を紹介します。
### 左境界探索を再利用する
### 左境界探索を再利用する
`target`の最も右の出現を見つけるには、最も左の`target`を見つけるために使用された関数を利用できます。具体的には、最も右のターゲットの探索を最も左のターゲット + 1の探索に変換します。
実際には、最も左の要素を探す関数を利用して最も右の要素を探せます。具体的には、**最も右にある `target` を探すことを、最も左にある `target + 1` を探すことに変換します**
下図に示すように、探索完了後、ポインタ$i$は最も左`target + 1`(存在する場合)を指し、ポインタ$j$は`target`の最も右の出現を指します。したがって$j$を返すことで右境界が得られます
下図ように、探索完了後、ポインタ $i$ は最も左にある `target + 1`(存在する場合)を指し、$j$ は最も右にある `target` を指します。**したがって $j$ を返せばよいです**
![Transforming the search for the right boundary into the search for the left boundary](binary_search_edge.assets/binary_search_right_edge_by_left_edge.png)
![右端境界の探索を左端境界の探索に変換する](binary_search_edge.assets/binary_search_right_edge_by_left_edge.png)
返される挿入位置は$i$であることに注意してください。したがって、$j$を得るためには1を引く必要があります
返される挿入位置は $i$ なので、そこから $1$ を引いて $j$ を得る必要があることに注意してください
```src
[file]{binary_search_edge}-[class]{}-[func]{binary_search_right_edge}
@@ -41,16 +41,16 @@
### 要素探索に変換する
配列に`target`が含まれていない場合、$i$と$j$は最終的に`target`より大きい最初の要素と小さい最初の要素をそれぞれ指します。
配列に `target` が含まれない場合、最終的に $i$ と $j$ はそれぞれ `target` より大きい最初の要素と`target` より小さい最初の要素を指すことになります。
したがって、下図に示すように、配列に存在しない要素を構して、左右の境界を探索できます。
したがって、下図ように、配列に存在しない要素を構して、それを使って左右の境界を探ます。
- 最も左`target`を見つけるには`target - 0.5`を探索することに変換でき、ポインタ$i$を返します。
- 最も右`target`を見つけるには`target + 0.5`を探索することに変換でき、ポインタ$j$を返します。
- 最も左にある `target` の探索`target - 0.5` を探ことに変換でき、ポインタ $i$ を返します。
- 最も右にある `target` の探索`target + 0.5` を探ことに変換でき、ポインタ $j$ を返します。
![Transforming the search for boundaries into the search for an element](binary_search_edge.assets/binary_search_edge_by_element.png)
![境界の探索を要素の探索に変換する](binary_search_edge.assets/binary_search_edge_by_element.png)
コードはここでは省略されていますが、このアプローチについて注意すべき2つの重要な点があります。
ここではコードを省略しますが、次の 2 点に注意が必要です。
- 与えられた配列`nums`には小数が含まれていないため、等しい場合の処理は心配ありません。
- ただし、このアプローチで小数を導入するには、`target`変数を浮動小数点型に変更する必要があります(Pythonは変更不要です)。
- 与えられた配列には小数が含まれないため、等しい場合をどう処理するかを気にする必要はありません。
- この方法では小数を導入するため、関数内の変数 `target` を浮動小数点型に変更する必要があります(Python は変更不要です)。