This commit is contained in:
krahets
2026-08-18 03:09:22 +08:00
parent d8c34d88b5
commit ba5285949b
108 changed files with 237 additions and 229 deletions
@@ -26,7 +26,7 @@ comments: true
進一步思考二分搜尋過程:當 `nums[m] < target` 時 $i$ 移動,這意味著指標 $i$ 在向大於等於 `target` 的元素靠近。同理,指標 $j$ 始終在向小於等於 `target` 的元素靠近。
因此二分結束時一定有:$i$ 指向首個大於 `target` 的元素,$j$ 指向個小於 `target` 的元素。**易得當陣列不包含 `target` 時,插入索引為 $i$** 。程式碼如下所示:
因此二分結束時一定有:$i$ 指向首個大於 `target` 的元素,$j$ 指向最右一個小於 `target` 的元素。**易得當陣列不包含 `target` 時,插入索引為 $i$** 。程式碼如下所示:
=== "Python"
@@ -344,7 +344,7 @@ comments: true
- 當 `nums[m] < target` 或 `nums[m] > target` 時,說明還沒有找到 `target` ,因此採用普通二分搜尋的縮小區間操作,**從而使指標 $i$ 和 $j$ 向 `target` 靠近**。
- 當 `nums[m] == target` 時,說明小於 `target` 的元素在區間 $[i, m - 1]$ 中,因此採用 $j = m - 1$ 來縮小區間,**從而使指標 $j$ 向小於 `target` 的元素靠近**。
迴圈完成後,$i$ 指向最左邊的 `target` $j$ 指向個小於 `target` 的元素,**因此索引 $i$ 就是插入點**。
迴圈完成後,$i$ 指向最左邊的 `target` $j$ 指向最右一個小於 `target` 的元素,**因此索引 $i$ 就是插入點**。
=== "<1>"
![二分搜尋重複元素的插入點的步驟](binary_search_insertion.assets/binary_search_insertion_step1.png){ class="animation-figure" }
@@ -389,7 +389,7 @@ comments: true
elif nums[m] > target:
j = m - 1 # target 在區間 [i, m-1] 中
else:
j = m - 1 # 個小於 target 的元素在區間 [i, m-1] 中
j = m - 1 # 最右一個小於 target 的元素在區間 [i, m-1] 中
# 返回插入點 i
return i
```
@@ -407,7 +407,7 @@ comments: true
} else if (nums[m] > target) {
j = m - 1; // target 在區間 [i, m-1] 中
} else {
j = m - 1; // 個小於 target 的元素在區間 [i, m-1] 中
j = m - 1; // 最右一個小於 target 的元素在區間 [i, m-1] 中
}
}
// 返回插入點 i
@@ -428,7 +428,7 @@ comments: true
} else if (nums[m] > target) {
j = m - 1; // target 在區間 [i, m-1] 中
} else {
j = m - 1; // 個小於 target 的元素在區間 [i, m-1] 中
j = m - 1; // 最右一個小於 target 的元素在區間 [i, m-1] 中
}
}
// 返回插入點 i
@@ -449,7 +449,7 @@ comments: true
} else if (nums[m] > target) {
j = m - 1; // target 在區間 [i, m-1] 中
} else {
j = m - 1; // 個小於 target 的元素在區間 [i, m-1] 中
j = m - 1; // 最右一個小於 target 的元素在區間 [i, m-1] 中
}
}
// 返回插入點 i
@@ -474,7 +474,7 @@ comments: true
// target 在區間 [i, m-1] 中
j = m - 1
} else {
// 個小於 target 的元素在區間 [i, m-1] 中
// 最右一個小於 target 的元素在區間 [i, m-1] 中
j = m - 1
}
}
@@ -498,7 +498,7 @@ comments: true
} else if nums[m] > target {
j = m - 1 // target 在區間 [i, m-1] 中
} else {
j = m - 1 // 個小於 target 的元素在區間 [i, m-1] 中
j = m - 1 // 最右一個小於 target 的元素在區間 [i, m-1] 中
}
}
// 返回插入點 i
@@ -520,7 +520,7 @@ comments: true
} else if (nums[m] > target) {
j = m - 1; // target 在區間 [i, m-1] 中
} else {
j = m - 1; // 個小於 target 的元素在區間 [i, m-1] 中
j = m - 1; // 最右一個小於 target 的元素在區間 [i, m-1] 中
}
}
// 返回插入點 i
@@ -542,7 +542,7 @@ comments: true
} else if (nums[m] > target) {
j = m - 1; // target 在區間 [i, m-1] 中
} else {
j = m - 1; // 個小於 target 的元素在區間 [i, m-1] 中
j = m - 1; // 最右一個小於 target 的元素在區間 [i, m-1] 中
}
}
// 返回插入點 i
@@ -563,7 +563,7 @@ comments: true
} else if (nums[m] > target) {
j = m - 1; // target 在區間 [i, m-1] 中
} else {
j = m - 1; // 個小於 target 的元素在區間 [i, m-1] 中
j = m - 1; // 最右一個小於 target 的元素在區間 [i, m-1] 中
}
}
// 返回插入點 i
@@ -584,7 +584,7 @@ comments: true
} else if nums[m as usize] > target {
j = m - 1; // target 在區間 [i, m-1] 中
} else {
j = m - 1; // 個小於 target 的元素在區間 [i, m-1] 中
j = m - 1; // 最右一個小於 target 的元素在區間 [i, m-1] 中
}
}
// 返回插入點 i
@@ -605,7 +605,7 @@ comments: true
} else if (nums[m] > target) {
j = m - 1; // target 在區間 [i, m-1] 中
} else {
j = m - 1; // 個小於 target 的元素在區間 [i, m-1] 中
j = m - 1; // 最右一個小於 target 的元素在區間 [i, m-1] 中
}
}
// 返回插入點 i
@@ -627,7 +627,7 @@ comments: true
} else if (nums[m] > target) {
j = m - 1 // target 在區間 [i, m-1] 中
} else {
j = m - 1 // 個小於 target 的元素在區間 [i, m-1] 中
j = m - 1 // 最右一個小於 target 的元素在區間 [i, m-1] 中
}
}
// 返回插入點 i
@@ -652,7 +652,7 @@ comments: true
elsif nums[m] > target
j = m - 1 # target 在區間 [i, m-1] 中
else
j = m - 1 # 個小於 target 的元素在區間 [i, m-1] 中
j = m - 1 # 最右一個小於 target 的元素在區間 [i, m-1] 中
end
end